は、私は、次のコードはコンパイルして実行(vc2012 & gcc4.7.2)プライベートタイプでautoを使用できるのはなぜですか?
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
を使用するのはなぜですか(名前は使用できません)。
'のstdがあるとして' f.Baz()i'は、もOKであることを確認::。 cout << typeid(f.Baz()).name() '。クラスの外のコードは 'Baz()'によって返される型を "見る"ことができます。もしそれを保持できれば、名前を付けることはできません。 –
もしあなたがそれが奇妙だと思うなら(それはあなたがそれについて尋ねているのを見ているだけではありません)、この戦略は[Safe-Bool Idiom](http:// www .artima.com/cppsource/safebool.html)でも。 –
私は覚えておくべきことは、コンパイラが実行するのを助けることができるようにAPIを記述するための便宜として、 'private'がそこにあるということです。 'Foo'のユーザが' Bar'型へのアクセスを防ぐことを意図していないので、 'Bar'のインスタンスを返すことによってそのアクセスを提供することから何らかの形でFooを妨げることはありません。 –