なぜプライベート型でautoを使用できるのですか? 質問する

なぜプライベート型でautoを使用できるのですか? 質問する

以下のコードがコンパイルされて実行されることに驚きました (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プライベート タイプでは を使用できるのに、その名前は (予想どおり) 使用できないのはなぜですか?

ベストアンサー1

のルールはauto、ほとんどの場合、テンプレート型推論と同じです。投稿された例は、プライベート型のオブジェクトをテンプレート関数に渡すことができるのと同じ理由で機能します。

template <typename T>
void fun(T t) {}

int main() {
    Foo f;
    fun(f.Baz());         // ok
}

では、なぜプライベート型のオブジェクトをテンプレート関数に渡すことができるのでしょうか? それは、型の名前だけがアクセスできないためです。型自体はまだ使用できるため、クライアント コードに返すことができます。

おすすめ記事