return {}和return Object {}之间的区别

时间:2018-06-21 15:21:44

标签: c++ c++11 initialization list-initialization

这两个功能之间有明显区别吗?

struct Object {
    Object(int i) : i{i}
    {
    }

    int i;
};

Object f() { return {1}; }
Object g() { return Object{1}; }

2 个答案:

答案 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会执行某种形式的副本初始化并且不能使用显式构造函数。