C++ 返回{}和返回对象{}之间的差异
这两种功能之间是否有显著差异C++ 返回{}和返回对象{}之间的差异,c++,c++11,initialization,list-initialization,C++,C++11,Initialization,List Initialization,这两种功能之间是否有显著差异 struct Object { Object(int i) : i{i} { } int i; }; Object f() { return {1}; } Object g() { return Object{1}; } 你写的例子没有什么不同。但是,如果您将构造函数标记为显式,则会出现差异。那么只有g才是正确的,因为它直接初始化,而f执行复制初始化,不能使用显式构造函数。第一个是,将选择合适的构造函数(即对象::对象(int)
struct Object {
Object(int i) : i{i}
{
}
int i;
};
Object f() { return {1}; }
Object g() { return Object{1}; }
你写的例子没有什么不同。但是,如果您将构造函数标记为显式,则会出现差异。那么只有
g
才是正确的,因为它直接初始化,而f
执行复制初始化,不能使用显式构造函数。第一个是,将选择合适的构造函数(即对象::对象(int)
)来构造返回值
第二个将通过(也调用Object::Object(int)
)构造一个临时对象,然后将其复制到返回值。由于(C++17保证了这一点),这里省略了复制或移动构造
因此,对于你的例子,它们具有相同的效果<代码>对象::对象(int)
用于构造返回值。请注意,对于第一种情况,如果构造函数是显式的,则不会使用它
- 直接列表初始化(同时考虑显式和非显式构造函数)
- 复制列表初始化(同时考虑显式和非显式构造函数,但只能调用非显式构造函数)