hansmaad hansmaad - 3 months ago 8
C++ Question

Why can I use auto on a private type?

I was somehow surprised that the following code compiles and runs (vc2012 & gcc4.7.2)

class Foo {
struct Bar { int i; };
public:
Bar Baz() { return Bar(); }
};

int main() {
Foo f;
// Foo::Bar b = f.Baz(); // error
auto b = f.Baz(); // ok
std::cout << b.i;
}


Is it correct that this code compiles fine? And why is it correct? Why can I use
auto
on a private type, while I can't use its name (as expected)?

Answer

The rules for auto are, for the most part, the same as for template type deduction. The example posted works for the same reason you can pass objects of private types to template functions:

template <typename T>
void fun(T t) {}

int main() {
    Foo f;
    fun(f.Baz());         // ok
}

And why can we pass objects of private types to template functions, you ask? Because only the name of the type is inaccessible. The type itself is still usable, which why you can return it to client code at all.

Comments