gpt4 book ai didi

c++ - 具有单个参数的模糊构造函数 : initializer_list and int

转载 作者:太空狗 更新时间:2023-10-29 20:37:29 27 4
gpt4 key购买 nike

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

Vector v { 3 };

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

class Vector
{
public:
Vector(initializer_list<double> lst);
Vector(int s);
// ...
private:
double* elem;
int sz;
};

和:

int main()
{
Vector v1 { 3 }; //calls init_list ctor
Vector v2 { static_cast<int>(3)}; //calls init_list ctor
Vector v3 = 3; //call int ctor
}

我最初的想法是使用 { 3 }语法将调用接受 int 的构造函数, 然后意识到这是有道理的,因为我也可以使用类似 { 3, 4, 5, 6 } 的东西那会起作用——传递的数组将被视为 double 和 Vector将被实例化。

然后我想,“我如何使用 {}-notation 并调用接受 int 的构造函数?”我尝试将其转换为 int这样它将强制使用所述构造函数,但这并没有发生。那时我发现我可以使用用于初始化 v3 的方法.

我又玩了一会儿,用 initializer_list<double> 删除了构造函数参数,令我惊讶的是,初始化 v1v2正在调用采用 int 的构造函数一个论点。

那么,这是正常/标准的吗?它被认为是一个功能?我会认为 int构造函数在传递单个 int 时优先到初始化程序与隐式转换为 doubledouble* .

最佳答案

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

Vector v3 = 3;

这是有效的,因为您有一个采用 int 的非显式构造函数,因此允许从 intVector 的隐式转换。这通常不是一个好主意,因为您可以在不需要时进行隐式转换。

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

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

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

关于c++ - 具有单个参数的模糊构造函数 : initializer_list and int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34617225/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com