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

elv*_*kaj 18 c++ initialization c++11 list-initialization

这两个功能之间有什么显着差异吗?

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

    int i;
};

Object f() { return {1}; }
Object g() { return Object{1}; }
Run Code Online (Sandbox Code Playgroud)

son*_*yao 20

第一个是复制列表初始化,Object::Object(int)将选择适当的构造函数(即)来构造返回值.

第二个将Object通过直接列表初始化(也调用Object::Object(int))构造临时,然后将其复制到返回值.由于复制省略(由C++ 17保证),这里省略了复制或移动构造.

因此,对于您的示例,它们具有相同的效果; Object::Object(int)用于构造返回值.请注意,对于第一种情况,如果构造函数是,explicit那么它将不会被使用.

  • direct-list-initialization(考虑显式和非显式构造函数)

  • copy-list-initialization(考虑显式和非显式构造函数,但只能调用非显式构造函数)


Sto*_*ica 8

你写的例子没有区别.但是如果你标记构造函数会产生差异explicit.然后才会g正确,因为它确实直接初始化,而f复制初始化的形式则不能使用显式构造函数.