return 表达式的 `{}` 的含义
Meaning of `{}` for return expression
无意中发现编译如下:
#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 类型而调用哪个构造函数的简单事实?
的具体形式
请参阅该参考资料中列表中的第 8 条:
List initialization is performed in the following situations:
...
copy-list-initialization (both explicit and non-explicit constructors are considered, but only non-explicit constructors may be called)
...
- in a return statement with braced-init-list used as the return expression and list-initialization initializes the returned object
return {k, cstr};
表示 {k, cstr}
是 return 值的初始值设定项。此外,它表示“return 函数的 return 类型的对象用 k
和 cstr
初始化,这意味着确切的行为取决于 returned对象的类型。
return 值可以用两种不同的方式初始化:
return A(k, cstr);
- return 值是 copy-initialized 来自 k, cstr
return {k, cstr};
- return 值是 class A
. 的 copy list initialized
无意中发现编译如下:
#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 类型而调用哪个构造函数的简单事实?
请参阅该参考资料中列表中的第 8 条:
List initialization is performed in the following situations:
...
copy-list-initialization (both explicit and non-explicit constructors are considered, but only non-explicit constructors may be called)
...
- in a return statement with braced-init-list used as the return expression and list-initialization initializes the returned object
return {k, cstr};
表示 {k, cstr}
是 return 值的初始值设定项。此外,它表示“return 函数的 return 类型的对象用 k
和 cstr
初始化,这意味着确切的行为取决于 returned对象的类型。
return 值可以用两种不同的方式初始化:
return A(k, cstr);
- return 值是 copy-initialized 来自k, cstr
return {k, cstr};
- return 值是 classA
. 的 copy list initialized