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)