return {} 和 return 对象{}之间的区别
Difference between return {} and return Object{}
这两个函数有什么明显的区别吗?
struct Object {
Object(int i) : i{i}
{
}
int i;
};
Object f() { return {1}; }
Object g() { return Object{1}; }
你写的例子没有区别。但是如果将构造函数标记为explicit
,就会出现差异。那么只有 g
是正确的,因为它进行直接初始化,而 f
进行一种形式的复制初始化并且不能使用显式构造函数。
第一个是copy-list-initialization,将选择合适的构造函数(即Object::Object(int)
)来构造return值。
第二个将通过direct-list-initialization, (which also calls Object::Object(int)
), then copy it to the return value. Because of copy elision构造临时Object
(C++17保证),此处省略复制或移动构造。
因此对于您的示例,它们具有相同的效果; Object::Object(int)
用于构造 return 值。请注意,对于第一种情况,如果构造函数是 explicit
那么它将不会被使用。
direct-list-initialization (both explicit and non-explicit constructors are considered)
copy-list-initialization (both explicit and non-explicit constructors are considered, but only non-explicit constructors may be called)
这两个函数有什么明显的区别吗?
struct Object {
Object(int i) : i{i}
{
}
int i;
};
Object f() { return {1}; }
Object g() { return Object{1}; }
你写的例子没有区别。但是如果将构造函数标记为explicit
,就会出现差异。那么只有 g
是正确的,因为它进行直接初始化,而 f
进行一种形式的复制初始化并且不能使用显式构造函数。
第一个是copy-list-initialization,将选择合适的构造函数(即Object::Object(int)
)来构造return值。
第二个将通过direct-list-initialization, (which also calls Object::Object(int)
), then copy it to the return value. Because of copy elision构造临时Object
(C++17保证),此处省略复制或移动构造。
因此对于您的示例,它们具有相同的效果; Object::Object(int)
用于构造 return 值。请注意,对于第一种情况,如果构造函数是 explicit
那么它将不会被使用。
direct-list-initialization (both explicit and non-explicit constructors are considered)
copy-list-initialization (both explicit and non-explicit constructors are considered, but only non-explicit constructors may be called)