Ich war irgendwie überrascht, dass der folgende Code kompiliert und ausgeführt wird (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;
}
Ist es richtig, dass dieser Code gut kompiliert wird? Und warum ist es richtig? Warum kann ich auto
einen privaten Typ verwenden, während ich seinen Namen nicht verwenden kann (wie erwartet)?
private
es eine Annehmlichkeit gibt, APIs so zu beschreiben, dass der Compiler sie durchsetzen kann. Es ist nicht beabsichtigt, den Zugriff Bar
von Benutzern auf den Typ zu verhindern Foo
, daher wird es Foo
in keiner Weise daran gehindert, diesen Zugriff durch Rückgabe einer Instanz von anzubieten Bar
.
#include <iostream>
. ;-)
f.Baz().i
auch in Ordnung iststd::cout << typeid(f.Baz()).name()
. Code außerhalb der Klasse kann den zurückgegebenen Typ "sehen",Baz()
wenn Sie ihn erhalten können, können Sie ihn einfach nicht benennen.