Ich benutze Visual Studio 2012, und ich habe etwas gefunden, das irgendwie seltsam ist. Ich schreibe nicht etwas, das ich unbedingt benötigen, um über mehrere Compiler kompatibel zu sein, aber es kann später werden (wenn der Code ins Web gestellt wird, wollen die Benutzer keine Compilerfehler bekommen), aber ich möchte nicht schreiben etwas, das falsch oder einfach nicht nativ ist."Auto" Typ Abzug kompiliert, während expliziter Typ gibt Fehler
So ist dieser Testcode:
class A{
class B{
public:
int i;
};
B myB;
public:
B& getB() { return myB; }
};
int main()
{
A a;
A::B& b = a.getB();
auto& b2 = a.getB();
}
Die erste Zeile in Haupt Pop error C2248: 'A::B' : cannot access private class declared in class 'A'
wohingegen die zweite Leitung normalerweise kompiliert. Ich frage mich, soll Auto so funktionieren oder ist das ein weiterer Fehler in Visual Studio?
Ich habe keine andere Compiler kann ich es mit
testen auf Sie können sogar Sachen wie std::cout << b2.i << "\n";
schreiben und es kompiliert völlig in Ordnung
Per πάντα ῥεῖ Kommentar habe ich versucht, ideone mit gcc 4.8 .1 und es kompiliert auf die gleiche Weise, erste Zeile ist Fehler, zweite Zeile ist völlig in Ordnung.
_'PS: Ich habe keinen anderen Compiler, den ich es mit '_ testen kann: http://isocpp.org/blog/2013/01/online-c-compilers besonders http://rise4fun.com/ vcpp –
Interessant. Ich hatte nie über die Rechtmäßigkeit von so etwas nachgedacht, aber es scheint auch mit gcc und clang zu kompilieren. –
Mit dem Code in 'main' zur Initialisierung von' b' und 'b2' führt die Ausgabeanweisung zu [* undefined behavior *] (http://en.wikipedia.org/wiki/Undefined_behavior) als' b' und ' b2' sind Verweise auf Objekte, die zerstört wurden –