考虑以下计划:
#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
的初始化之间有区别吗?任何主题都是直接初始化的。
答案 0 :(得分:2)
A a(4,4);
沼泽标准直接初始化。
A b{4,4};
沼泽标准直接列表初始化。由于A
没有initializer_list
构造函数,因此最终会执行与上面相同的操作。不会构造或销毁任何std::initializer_list
对象。
A c({4,4});
此直接初始化 c
来自A
临时,而 copy-list-initialized 来自支撑-init-list {4, 4}
。请注意,如果A::A(int, int)
为explicit
,这将无效,因为在这种情况下,复制列表初始化将是格式错误的,并且您没有可行的构造函数来调用。临时建筑和破坏可以省略,通常是。