9

このコードが MS Visual C++ でコンパイルされて成功したのを見て、私は驚きました。

struct foo {
    struct foo(int i): value(i) {}
    int value;
};

structそのような奇妙な文脈でキーワードを意味するのは何ですか?

4

1 に答える 1

10

ほとんどのコンテキストでは、クラス名だけでなく、詳細な型指定子 struct foo、または同等のものを使用できます。これは、あいまいさを解決するのに役立ちます。class foofoo

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++ があらゆる種類の不安定なコードをコンパイルしても驚かないでください。言語に対する非標準の拡張機能で有名です。

于 2013-07-19T12:55:48.937 に答える