2011-08-12 9 views
3

私はC++0x faqを読んでいて、イニシャライザのリストを詳しく説明したセクションに出てきました。例は、ほとんどのバリエーションた:"var {args}"でC++ 0xの新機能、あるいは単に構文的な砂糖を初期化していますか?

vector<int> vi = { 1, 2, 3 }; 
vector<int> vj({1, 2, 3}); 
// etc. 

はしかし、また、記載された形だった:

vector<int> vk{2}; 

このフォームは他の場所でよくある質問で表示され、私はそれがより意味的に異なっているかどうかの好奇心最初の2つの形式、あるいは構文的な砂糖のみvk({x, y, z})

答えて

1

一つは均一な初期化であり、他方は初期化子リストです。あなたが見ることができるように、彼らは同様の構文を生成することができますが、彼らは2つの異なるものです。

vector<int> vk{2}; 

は均一な初期化です。他の2つはイニシャライザリストです。

+0

を; ' –

+1

私には意味がありません。 'ベクトル vk {2}'では、イニシャライザリストも使用しています。 –

6

({1, 2, 3})フォームは、vector<int>のコンストラクタを直接呼び出し、第1引数として{1, 2, 3}を渡します。あなたはvector<int>は、その最初のパラメータinitializer_listまたは{1, 2, 3}によって初期化することができ、別の型(のような、別のコンテナクラス)であるコンストラクタを持っていない場合、それは動作しません

vector<int> vk({1, 2, 3}, myAllocator); 

を複数の引数を渡すことができました。あなたの場合は、vector<int>に実際には最初のパラメータがinitializer_list<int>のコンストラクタがあるために動作します。これは、括弧を省略した場合、通常の機能では、

void f(vector<int> const& vk); 
int main() { f({1, 2, 3}); } 

を呼び出すvector<int> vk{1, 2, 3}のように、正確な意味は、クラスによって異なりだけのようです。 A vector<int>には、初期化子リストコンストラクタがあります。このコンストラクタは、最初のパラメータがinitializer_list<int>(オプションで参照)で、その他のすべてのパラメータがデフォルトの引数を持つコンストラクタです。クラスにこのようなコンストラクタがある場合、初期化子リストはそのコンストラクタに渡されます。あるいは、クラスは単純に集合体でもかまいません(struct A { int a; int b; int c; };のように、初期化子リストはメンバーを初期化します)。3を別々のint引数として受け入れるコンストラクタを持つことができます。それが明示的なコンストラクタを使用することを禁じていることを除いて

最後= { 1, 2, 3 }フォームは、括弧を省略したバージョンとほとんど同じである(つまり、単に=の除去)は、(つまり、彼らはexplicit vector(initializer_list<int>);としてそれを宣言していたか、彼らはそれがだろう、代わりにexplicit vector(int, int, int);を宣言していました= { 1, 2, 3 }を使用するとエラーになります)。

0

均一な初期化が狭く変換はデータの損失を引き起こすコンバージョンすなわち防ぐ: `のstd ::ベクトル VK {1、2、3}:純粋な均一な初期化された形態でもあり

#include <vector> 

std::vector<float> v{1.0F, 2.0F, 3.0F}; // OK: 

std::vector<float> w{1.0, 2.0, 3.0}; // OK: doubles could be put into floats without loss. 

std::vector<int> j{1.1, 2.2, 3.3}; // error: narrowing 

std::vector<int> k{1L, 2L, 3L}; // OK: the long numbers can be represented as int without loss. 

std::vector<int> l{0xfacebeefL, 0xdeadbabeL, 0xfadecabeL}; // error: narrowing. 
関連する問題