2013-07-19 7 views
9

私はこのコードの成功がMS Visual C++でコンパイルされているのを見て驚きました。コンストラクタ名の前にキーワードstruct

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

キーワードstructは、このような奇妙な文脈でキーワードを意味しますか?

+0

私のためにG ++ 4.8でコンパイルされません。しかし、MS vs2010コンパイラはそれを受け入れます。奇妙な解析バグのようなにおいがする。どのコンパイラを使用していますか? – SteveLove

+0

[タグ:Visual C++]、MSコンパイラ。申し訳ありませんが、私はこれをディスクロージャーに書いてください。 –

+0

なぜdownvotes?問題は正しいですし、VC++(少なくともVC++ 2010)では警告なしでコンパイルします。答えを知らないことは、ダウンボントする理由ではありません。これが標準に反しているということはどちらもありません。 – Gorpik

答えて

10

はほとんどのコンテキストでは、だけでなく、クラス名fooの、精巧な型指定struct foo、または同等class 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++ですべての種類のコードがコンパイルされると、一般的には驚いてはいけません。その言語に対する非標準的な拡張が有名です。

+0

もう一つの追加があります:クラスの既定値はプライベート継承ですが、構造体の既定値はpublicです。 –

+5

@ IanM_Matrix1:それはクラス定義で 'class'と' struct'を使うことの違いです。ここではクラスの定義については言及していません。クラスの型を参照するための型指定子です。そこに 'class'と' struct'を使うことには違いはありません。 –

関連する問題