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 类型而调用哪个构造函数的简单事实?

这是copy list initialization

的具体形式

请参阅该参考资料中列表中的第 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)

...

  1. 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 类型的对象用 kcstr 初始化,这意味着确切的行为取决于 returned对象的类型。

return 值可以用两种不同的方式初始化: