このコードが MS Visual C++ でコンパイルされて成功したのを見て、私は驚きました。
struct foo {
struct foo(int i): value(i) {}
int value;
};
struct
そのような奇妙な文脈でキーワードを意味するのは何ですか?
このコードが MS Visual C++ でコンパイルされて成功したのを見て、私は驚きました。
struct foo {
struct foo(int i): value(i) {}
int value;
};
struct
そのような奇妙な文脈でキーワードを意味するのは何ですか?
ほとんどのコンテキストでは、クラス名だけでなく、詳細な型指定子 struct foo
、または同等のものを使用できます。これは、あいまいさを解決するのに役立ちます。class foo
foo
struct foo {}; // Declares a type
foo foo; // Declares a variable with the same name
foo bar; // Error: "foo" refers to the variable
struct foo bar; // OK: "foo" explicitly refers to the class type
ただし、コンストラクターを宣言するときにこの形式を使用することはできないため、コンパイラーがそのコードを受け入れるのは間違っています。コンストラクター宣言の仕様 (C++11 12.1/1) では、クラス名自体のみが許可され、詳細な型指定子は許可されません。
一般に、Visual C++ があらゆる種類の不安定なコードをコンパイルしても驚かないでください。言語に対する非標準の拡張機能で有名です。