当前位置:  开发笔记 > 编程语言 > 正文

带有单个参数的歧义构造函数:initializer_list和int

如何解决《带有单个参数的歧义构造函数:initializer_list和int》经验,为你挑选了1个好方法。

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

Vector v { 3 };

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

class Vector
{
public:
    Vector(initializer_list lst);
    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,并用参数删除了构造函数,令我惊讶的是,初始化v1v2调用构造函数来获取int参数.

那么,这是正常/标准吗?它被认为是一个功能?我认为int构造函数在将单个传递int给初始化器而不是隐式转换为double和时会有优先权double*.



1> TartanLlama..:

这是标准的.如果存在std::initializer_list具有兼容参数的构造函数,则在使用列表初始化时将通过不同的构造函数选择该构造函数.

Vector v3 = 3;

这是有效的,因为你有一个非显式构造函数int,因此允许从中int进行隐式转换Vector.这通常不是一个好主意,因为当你不想要它们时你可以获得隐式转换.

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

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

如果你可以帮助它,通常最好避免这些逻辑上模糊的构造函数,因为这些规则可能很烦人.在这种情况下,既然你在模拟std::vector,它可能还可以.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有