2013-08-15 18 views
6

C++11では、それは以下のように均一な初期設定を使用してstructを初期化することが可能です:一様な初期化はどのようにすればよいですか?

struct BasicStruct { 
    BasicStruct (int x, double y) : x_{x}, y_{y} {} 

private: 
    int x_; 
    double y_; 
}; 

BasicStruct var1{5, 3.2}; 

質問:

  1. 私はBasicStruct var1(5, 3.2)のようなコンストラクタを呼び出すのではなく、この構文BasicStruct var1{5, 3.2}を使用する必要がありますか?

  2. 古いファッションの方法の代わりにx_{x}のような属性を初期化する必要がありますかx_(x)

+2

いいえ、それは「理由」で、これは「いつ」ですか。真剣に人々。 – Potatoswatter

+0

@ Potatoswatter http://stackoverflow.com/questions/1863784/uniform-initialization-in-c0x-when-to-use-instead-of?rq=1など – Rapptz

+0

@Rapptz今、私がここに追加したものよりも優れています:) – Potatoswatter

答えて

4

使用リスト初期化リストは、一般的なものであり、あなたがはるかにその意味を変えずに、このような配列、集計、またはvectorとして、別の容器に置き換えることができます。

// "triplet" may be a struct, an array, or a std::vector, 
// but it has at least single-precision floating-point values. 
triplet dimensions { 5, 1.2f, static_cast<float>(M_PI) }; 

特定のコンストラクタへの引数を使用して特定のクラスを構築する場合は、旧式の括弧が適切です。

ブレース-INIT-リストを初期化の一つのユニークな特徴は、それが例えば数値データが失われる原因となり縮小変換、浮動小数点数または高ビットの小数部を許可しないことですlongのこれは、例えば次のような置換に起因するエラーにフラグを付ける(または防止する)のに役立ちます。コードリファクタリング時にはより狭い配列型になります。

同様に、x{ y }が適切であるもう1つのケースは、損失を伴わない数値変換を実行する場合です。 x(y)は、reinterpret_castに頼っていても、変換を行うことを本当に難しくしており、一般的に避けるべきです。

用語「統一初期化」は少し楽観的であり、標準には現れません。それはすべての場合に適切ではありません。中括弧は一般的にリストを示しているので、リスト初期化とも呼ばれます。そして、それが使用されるべき時です。

関連する問題