C++ C++;11:()或{}在列表初始化中?

C++ C++;11:()或{}在列表初始化中?,c++,c++11,vector,initialization,list-initialization,C++,C++11,Vector,Initialization,List Initialization,我指的是“”,即 如果存在可匹配的构造函数,那么它将调用构造函数 Example (p200): struct S { // no initializer-list constructors S(int, double, double); // #1 S(); // #2 // ... }; S s1 = { 1, 2, 3.0 }; // OK: invoke #1 S s2 { 1.0, 2, 3 }; // error: narrowing 否则,它将使

我指的是“”,即

如果存在可匹配的构造函数,那么它将调用构造函数

Example (p200):
struct S {
    // no initializer-list constructors
    S(int, double, double); // #1
    S(); // #2
    // ...
};

S s1 = { 1, 2, 3.0 }; // OK: invoke #1
S s2 { 1.0, 2, 3 }; // error: narrowing
否则,它将使用聚合初始化

下面是一个使用
vector
的示例,它有一个来自
size\u t
的显式构造函数和一个
初始值设定项\u列表
构造函数:

vector<double> v1(7);   // ok: v1 has 7 elements
vector<double> v1{7};   // ok: v1 has 1 element (with its value 7.0)
向量v1(7);//好的:v1有7个元素 向量v1{7};//ok:v1有1个元素(其值为7.0)
在这里我感到困惑。为什么
向量
构造函数的行为与
S
不同?

因为
初始值设定项列表
重载比所有其他构造函数都更受欢迎。从[over.match.list]开始:

当列表初始化非聚合类类型
T
的对象时(8.5.4),重载解析选择构造函数 分两个阶段:

(1.1)-最初,候选函数是类
T
和 参数列表由初始值设定项列表作为单个参数组成。
(1.2)-如果未找到可行的初始值设定项列表构造函数,则再次执行重载解析,其中 候选函数是类
T
的所有构造函数,参数列表由元素组成 初始值设定项列表的

是一个非聚合类,它有两个相关构造函数:

explicit vector( size_type count );           // (3)
vector( std::initializer_list<T> init,        // (7)
    const Allocator& alloc = Allocator() );
显式向量(大小_类型计数);//(3)
向量(std::初始值设定项\列表初始值,//(7)
常量分配器&alloc=Allocator());

根据[over.match.best]中所述的顺序,由于(7)是一个可行的候选构造函数,因此我们不会在(1.2)点上考虑(3)。

谢谢。现在我在声明中发现,()无法工作,只有{}可以工作。@user1914692请不要将您的问题更改为提出其他问题。如果你有一个新问题,问一个新问题。