1.
vector<double> v { 0.0, 1.1, 2.2, 3.3 };
direct-list-initializationです。これは、初期化子リストを取るコンストラクターで初期化されることを意味します。
コンストラクター:
vector( std::initializer_list<T> init, const Allocator& alloc = Allocator() );
2.
vector<double> v = { 0.0, 1.1, 2.2, 3.3 };
copy-list-initializationです。
標準はかなり明確です:
8.5.4 リストの初期化 [dcl.init.list]
リスト初期化は、波括弧初期化リストからのオブジェクトまたは参照の初期化です。このような初期化子は初期化子リストと呼ばれ、リストのコンマ区切りの初期化句は初期化子リストの要素と呼ばれます。初期化リストは空である可能性があります。リスト初期化は、直接初期化またはコピー初期化コンテキストで発生する可能性があります。直接初期化コンテキストでのリスト初期化は直接リスト初期化と呼ばれ、コピー初期化コンテキストでのリスト初期化はコピーリスト初期化と呼ばれます。[ 注: リストの初期化を使用できます :
[...]
例 :
std::complex<double> z{1,2};
[...]
std::map<std::string,int> anim = { {"bear",4}, {"cassowary",2}, {"tiger",7} };
両者の違いについては、もう少し先に進む必要があります。
13.3.1.7 リスト初期化による初期化 [over.match.list]
- direct-list-initializationの場合、候補関数はクラス T のすべてのコンストラクターです。
- copy-list-initializationの場合、候補関数はすべて T のコンストラクターです。
ただし、
explicit
コンストラクターが選択された場合、初期化の形式は正しくありません。[注: この制限は、この初期化がオーバーロード解決の最終結果の一部である場合にのみ適用されます — 注釈の最後]