以下のコードがコンパイルされて実行されることに驚きました (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
}
では、なぜプライベート型のオブジェクトをテンプレート関数に渡すことができるのでしょうか? それは、型の名前だけがアクセスできないためです。型自体はまだ使用できるため、クライアント コードに返すことができます。