考虑以下程序:
#include <iostream>
struct A
{
A(int, int){ std::cout << "A(int, int)" << std::endl; }
};
A a(4,4);
A b{4,4};
A c({4,4});
int main(){ }
输出:
A(int, int)
A(int, int)
A(int, int)
我感兴趣的是 a
、b
和 c
的初始化之间有区别吗?任何主题都是直接初始化的。
最佳答案
A a(4,4);
沼泽标准直接初始化。
A b{4,4};
沼泽标准直接列表初始化。由于 A
没有 initializer_list
构造函数,所以这最终会做与上面相同的事情。没有 std::initializer_list
对象被构建或销毁。
A c({4,4});
这直接初始化 c
来自A
临时文件,后者又被copy-list-initialized来自 braced-init-list {4, 4}
。请注意,如果 A::A(int, int)
是 explicit
,这将不起作用,因为在那种情况下,copy-list-initialization 将是格式错误的并且你没有可行的构造函数可以调用。临时的构建和销毁可能会被省略,而且通常是这样。
关于c++ - 通过用户定义的构造函数初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27163395/