C++ 具有单参数的模糊构造函数:初始值设定项\u list和int

C++ 具有单参数的模糊构造函数:初始值设定项\u list和int,c++,c++11,C++,C++11,当使用此语法初始化对象时,什么决定了应该使用哪个构造函数;它依赖于编译器吗?(使用VS2015): 我正在创建自己的Vector类(学习C++11),我有以下几点: class Vector { public: Vector(initializer_list<double> lst); Vector(int s); // ... private: double* elem; int sz; }; 类向量 { 公众: 向量(初始值设定项列表ls

当使用此语法初始化对象时,什么决定了应该使用哪个构造函数;它依赖于编译器吗?(使用VS2015):

我正在创建自己的
Vector
类(学习C++11),我有以下几点:

class Vector
{
public:
    Vector(initializer_list<double> lst);
    Vector(int s);
    // ...
private:
    double* elem;
    int sz;
};
类向量
{
公众:
向量(初始值设定项列表lst);
向量(int-s);
// ...
私人:
双*元素;
int sz;
};
以及:

intmain()
{
向量v1{3};//调用init_列表
向量v2{static_cast(3)};//调用init_列表
向量v3=3;//调用int-ctor
}
我最初的想法是使用
{3}
语法调用接受
int
的构造函数,然后意识到这是有意义的,因为我也可以使用类似
{3,4,5,6}
的东西,这将起作用——传递的数组将被视为双倍,而
向量将被实例化

然后我想,“我如何使用
{}-表示法
调用接受
int
的构造函数?”我尝试将其转换为
int
,以便强制使用所述构造函数,但没有发生。那时我发现我可以使用init
v3
的方法

我又玩了一会儿,删除了带有
初始值设定项列表
参数的构造函数,令我惊讶的是,初始化
v1
v2
时调用了以
int
作为参数的构造函数


那么,这是否正常/标准?它被认为是一个特性吗?我认为
int
构造函数在将单个
int
传递给初始值设定项时具有优先权,而将隐式转换为
double
double*
这是标准的。如果存在具有兼容参数的
std::initializer\u list
构造函数,则如果使用列表初始化,将在不同的构造函数上选择该构造函数

Vector v3 = 3;
这是有效的,因为您有一个非显式构造函数,它接受
int
,因此允许从
int
Vector
的隐式转换。这通常不是一个好主意,因为当您不需要隐式转换时,可以得到隐式转换

当存在初始值设定项列表构造函数时,调用非初始值设定项列表构造函数的方法是使用括号进行初始化:

Vector v1 (3); //int constructor
Vector v2 {3}; //initializer_list constructor

通常,如果您可以帮助的话,最好避免这些逻辑上不明确的构造函数,因为这些规则可能会很烦人。在这种情况下,因为您正在模拟std::vector,所以它可能没问题。

简单的回答是,如果它可能被解释为初始值设定项列表,那么它会。只有完全失败,才会考虑其他可能性。
Vector v3 = 3;
Vector v1 (3); //int constructor
Vector v2 {3}; //initializer_list constructor