`{}`对返回表达式的意义
我偶然发现以下编译:
#include <string>
#include <iostream>
class A{
int i{};
std::string s{};
public:
A(int _i, const std::string& _s) : i(_i), s(_s) {
puts("Called A(int, const std::string)");
}
};
A foo(int k, const char* cstr){
return {k, cstr}; // (*)
}
int main(){
auto a = foo(10, "Hi!");
return 0;
}
感兴趣的线是 (*)。我猜这个函数foo相当于:
A foo(int k, const char* str){
return A(k, cstr);
}
但是,(*) 中是否有针对此机制的特殊名称?或者仅仅是编译器知道由于返回类型而调用哪个构造函数的简单事实?
回答
return {k, cstr};意味着它{k, cstr}是返回值的初始值设定项。此外,它表示“返回一个用kand初始化的函数返回类型的对象cstr,这意味着确切的行为取决于返回对象的类型”。
返回值可以通过两种不同的方式初始化:
return A(k, cstr);- 返回值从复制初始化k, cstrreturn {k, cstr};- 返回值是 从类初始化的副本列表A。
回答
这是拷贝列表初始化的一种具体形式
请参阅该参考文献中列表中的第 8 项:
列表初始化在以下情况下进行:
...
复制列表初始化(同时考虑显式和非显式构造函数,但只能调用非显式构造函数)
...
- 在使用花括号初始化列表作为返回表达式和列表初始化初始化返回对象的返回语句中