我在某種程度上驚訝的是,下面的代碼編譯和運行(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;
}
它是正確的,這個代碼編譯罰款?爲什麼它是正確的?爲什麼我可以在私人類型上使用auto
,而我無法使用其名稱(如預期的那樣)?
觀察到'f.Baz()i'也行,因爲是'的std :: cout << typeid(f.Baz())。name()'。如果你能掌握它,那麼類外的代碼就可以「看見」Baz()返回的類型,你不能命名它。 –
如果你認爲這很奇怪(你可能會這樣做,當你問這個問題時你會看到),你並不是唯一一個;)這個策略對於[安全布爾成語](http:// www .artima.com/cppsource/safebool.html)。 –
我認爲要記住的一點是'private'是爲了方便描述API而編譯器可以幫助執行的方式。它並不打算阻止'Foo'的用戶訪問'Bar'類型,因此它不會阻止'Foo'以任何方式通過返回'Bar'的實例來提供訪問。 –