Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回{}和返回对象{}之间的差异_C++_C++11_Initialization_List Initialization - Fatal编程技术网

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)
用于构造返回值。请注意,对于第一种情况,如果构造函数是显式的,则不会使用它

  • 直接列表初始化(同时考虑显式和非显式构造函数)

  • 复制列表初始化(同时考虑显式和非显式构造函数,但只能调用非显式构造函数)