这两个功能之间有明显区别吗?
struct Object {
Object(int i) : i{i}
{
}
int i;
};
Object f() { return {1}; }
Object g() { return Object{1}; }
答案 0 :(得分:20)
第一个是copy-list-initialization,将选择适当的构造函数(即Object::Object(int)
)来构造返回值。
第二个对象将通过direct-list-initialization(也称为Object
)构造一个临时Object::Object(int)
,然后将其复制到返回值。由于copy elision(由C ++ 17保证),因此这里省略了复制或移动构造。
因此,对于您的示例,它们具有相同的效果; Object::Object(int)
用于构造返回值。请注意,在第一种情况下,如果构造函数为explicit
,则不会使用它。
直接列表初始化(考虑显式和非显式构造函数)
复制列表初始化(考虑了显式和非显式构造函数,但只能调用非显式构造函数)
答案 1 :(得分:8)
您的示例在文字上没有任何区别。但是,如果您标记构造函数explicit
,则会有所不同。那么只有g
是正确的,因为它会直接初始化,而f
会执行某种形式的副本初始化并且不能使用显式构造函数。