2013-05-24 4 views
8

C++ 11スタイル(link)(00:35:30)のBjarne StroustrupのKeynoteを見ています。スライド):C++代入演算子の代わりに中括弧を使用したスコープ付き変数の宣言とインスタンス化

void f(int n, int x) 
{ 
     Gadget g {n}; 
     // ... 
     if (x<100) throw std::run_time_error{"Weird!"}; 
     if (x<200) return; 
     // ... 
} 

は、私は、オブジェクトと同様の構造体を使用してこのコードをコンパイルするが、両方のケースでは、コンパイラはそれが期待されていることを私に伝えてみました「;」 Gadget gの宣言の最後にはコンパイルされません。

私の質問は、したがって、以下のとおりです。私はgがインスタンス化されていることを前提とする修正

  • アム?
  • Gadgetこのコードをコンパイルするには、どのタイプのオブジェクトが必要ですか?
  • この行のコンセプトは何ですか:Gadget g {n};?すなわち、宣言の後の中括弧は何ですか?
  • (広すぎるかもしれませんが)なぜコンパイラは中括弧を有効な構文として認識しませんか?
+4

これはC++ 11の構文です。関連するコンパイラのサポートが必要です。 – juanchopanza

+4

C++ 11に準拠したコンパイラを使用して、 '-std = C++ 11'または' -std = C++ 0x'フラグ –

答えて

14

gがインスタンス化されていると仮定するのは正しいですか?

はい、正しいです。

Gadgetこのコードをコンパイルするにはどのような種類のオブジェクトが必要ですか。

intから初期化できる任意のタイプです。たとえば、Gadgetクラスのコンストラクタがintの場合、またはintから直接初期化できるものを取得すると、コードがコンパイルされます。

この行のコンセプトは何ですか:Gadget g {n};?すなわち、宣言の後の中括弧は何ですか?

これは統一的な初期化構文です。プログラマの意図、上記の例で

struct Widget { /* ... */ }; 
struct Gadget { Gadget(Widget const&) { /* ... */ } /* ... */ }; 

Gadget g(Widget()); // This is parsed a FUNCTION DECLARATION 

:これは、C++コンパイラは、(むしろオブジェクトの初期化などより)関数宣言として以下を解析するだろう括弧表記を持ついくつかの厄介な問題を排除しますオブジェクトgGadgetに構築し、それを一時的なWidgetオブジェクトから初期化することがありましたが、コンパイラはこれをGadgetを返す関数gの宣言として解析し、引数a(aへのポインタ)引数を受け入れずにWidgetを返す関数です。これはMost Vexing Parse問題として知られています。括弧を使用している場合、上記の問題が存在しないことを

お知らせ:

Gadget g{Widget{}}; // This could not be possibly parsed as a function declaration! 

(おそらくあまりにも幅広いが、)なぜコンパイラは有効な構文として中括弧を認識しないのでしょうか?

これは、C++ 11準拠のコンパイラを使用していない可能性が高いためです。 1つを使用して、-std=c++11または-std=c++0xコンパイルフラグを使用してC++ 11のサポートを有効にする必要があります。

+3

'Gadget = int;を使用すると、 intから初期化する;) –

関連する問題