1. ホーム
  2. c++

[解決済み] なぜプライベートタイプでautoが使えるのですか?

2022-05-06 15:11:28

質問

以下のコードがコンパイルされて実行されることになぜか驚いています (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 の名前を使うことはできませんが、プライベートな型には使えますか?

どうすればいいですか?

のルールは auto は、ほとんどの場合、テンプレート型控除と同じです。掲載した例は、テンプレート関数にプライベート型のオブジェクトを渡すことができるのと同じ理由で動作します。

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

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

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