C++ 使用大括号初始化std::vector使用初始值设定项列表

C++ 使用大括号初始化std::vector使用初始值设定项列表,c++,c++11,vector,constructor,C++,C++11,Vector,Constructor,当我用花括号替换内括号时,我得到了不同的结果。为什么? 在C++11之后,它们不是等价的吗?(除了防止整数降级之外) 为什么它会改变结构: fromstd::vector(大小\类型计数,常量T&value=T(),常量分配器&alloc=Allocator()) tostd::vector(std::initializer_list init,const分配器&alloc=Allocator()) 示例 auto th_buckets = std::vector<std::vector&

当我用花括号替换内括号时,我得到了不同的结果。为什么?

C++11
之后,它们不是等价的吗?(除了防止整数降级之外) 为什么它会改变结构:

from
std::vector(大小\类型计数,常量T&value=T(),常量分配器&alloc=Allocator())

to
std::vector(std::initializer_list init,const分配器&alloc=Allocator())

示例

auto th_buckets = std::vector<std::vector<int>>{2, std::vector<int>(5, 0)};
auto-th_bucket=std::vector{2,std::vector(5,0)};
0 0 0 0

0 0 0 0

auto-th_bucket=std::vector{2,std::vector{5,0};
50

50

不,它们不一样,如果一个类的构造函数采用std::initializer\u列表,则优先调用该构造函数,即使另一个构造函数适合初始化列表。vector确实有一个,因此第二个示例创建了一个包含[5,0]的列表,而第二个示例包含一个包含[0,0,0,0]的列表


人们普遍认为他们把这部分搞糟了,对不起

“在C++11之后它们不是等价的吗?”不,它们不是。他们做不同的事情。我不同意这种混乱<代码>{}
总是从值列表中初始化<代码>()
始终调用非列表构造函数。Easy-peasy.您会遇到这样的情况,实际行为取决于是否有std::initializer\u list构造函数。但是,Uniform有时并不那么统一。当有人忘了带太阳镜,每个人都不得不带太阳镜时,总是很糟糕。他们添加了
std::initializer\u list
,这样
{}
总是从值列表中初始化。如果
{}
没有为向量调用初始值设定项列表版本,这将是一个错误<代码>{}应始终从值列表中初始化。它是统一的,因为现在
{}
可以统一初始化值列表中的任何内容,而不仅仅是pod。“统一”并不意味着“始终使用此构造函数”。
auto th_buckets = std::vector<std::vector<int>>{2, std::vector<int>{5, 0}};