2014-07-06 29 views
18

我正在使用Visual Studio 2012,而且我發現有些奇怪的東西。我不是在編寫一些我需要在多個編譯器中兼容的東西,但它可能會變得更晚(當代碼放在Web上時,用戶不想要編譯器錯誤),但我不想寫這是錯誤的,或者不是本地的。「自動」類型演繹編譯雖然顯式類型給出錯誤

因此,這是試驗的代碼:

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(); 
} 

第一線的內側主彈出error C2248: 'A::B' : cannot access private class declared in class 'A'而第二線通常編譯。我想知道,汽車應該這樣工作還是這是Visual Studio中的另一個錯誤?

我沒有任何其他的編譯器,我可以

測試它你甚至可以寫的東西一樣std::cout << b2.i << "\n";和它編譯完美的罰款

按πάνταῥεῖ的評論,我想ideone用gcc 4.8 .1和它以相同的方式編譯,第一行是錯誤,第二行是完全正確的。

+4

_'PS:我沒有任何其他編譯器可以用'__對其進行測試:http://isocpp.org/blog/2013/01/online-c-compilers特別是http://rise4fun.com/ vcpp –

+1

有趣。我從來沒有考慮過這樣的事情的合法性,但它似乎也用gcc和clang編譯。 –

+0

用'main'中的代碼初始化'b'和'b2',輸出語句導致[*未定義的行爲*](http://en.wikipedia.org/wiki/Undefined_behavior)爲'b'和' b2'是對已經被破壞的對象 –

回答

10

我相信它應該像那樣工作。訪問適用於名稱,而不是它們引用的實體。

即使沒有auto它始終是合法的,例如,將getB的結果傳遞給期望B的函數。

+1

此外,如果您創建一個私有類的公共'typedef',使用'typedef''d名稱在使用私有類名稱時不會引發錯誤。 – Frxstrem

+3

或typedef:http://stackoverflow.com/questions/13532784/why-can-i-use-auto-on-a-private-type – kobigurk

+0

「訪問適用於名稱,而不是它們所指的實體」, *有點*。例如,C + 11§12.1/ 1「構造函數沒有名稱」。可以說,析構函數也沒有名字,事實上在C++ 11中,至少有一個(非規範的)註釋以這種方式論證。 –

3

auto應該這樣工作,是的,是的,這意味着它可以暴露私人類型。