什么决定了在使用这种语法初始化对象时应该使用哪个构造函数; 它是编译器依赖的吗?(使用VS2015):
Vector v { 3 };
我正在创建自己的Vector
类(学习C++ 11),我有以下内容:
class Vector { public: Vector(initializer_listlst); Vector(int s); // ... private: double* elem; int sz; };
和:
int main() { Vector v1 { 3 }; //calls init_list ctor Vector v2 { static_cast(3)}; //calls init_list ctor Vector v3 = 3; //call int ctor }
我最初的想法是使用{ 3 }
语法将调用接受一个构造函数int
,然后意识到,这是有道理的,因为我也可以使用像{ 3, 4, 5, 6 }
,并且将工作-通过阵列将被视为双打和Vector
将被实例化.
然后我想,"我怎么能使用{}-notation
并调用接受一个int
?的构造函数?"我尝试将它转换为一个,int
以便强制使用所述构造函数,但这并没有发生.那时我发现我可以使用用于初始化的方法v3
.
我玩了一点点initializer_list
,并用参数删除了构造函数,令我惊讶的是,初始化v1
并v2
调用构造函数来获取int
参数.
那么,这是正常/标准吗?它被认为是一个功能?我认为int
构造函数在将单个传递int
给初始化器而不是隐式转换为double
和时会有优先权double*
.
这是标准的.如果存在std::initializer_list
具有兼容参数的构造函数,则在使用列表初始化时将通过不同的构造函数选择该构造函数.
Vector v3 = 3;
这是有效的,因为你有一个非显式构造函数int
,因此允许从中int
进行隐式转换Vector
.这通常不是一个好主意,因为当你不想要它们时你可以获得隐式转换.
当存在初始化列表构造函数时,调用非初始化列表构造函数的方法是使用括号进行初始化:
Vector v1 (3); //int constructor Vector v2 {3}; //initializer_list constructor
如果你可以帮助它,通常最好避免这些逻辑上模糊的构造函数,因为这些规则可能很烦人.在这种情况下,既然你在模拟std::vector
,它可能还可以.