C++ 中指定初始值设定项时的模板参数推导

Fed*_*dor 5 c++ templates language-lawyer aggregate-initialization c++20

A<T>在下面的代码中,使用指定的初始化器以两种略有不同的形式使用模板参数推导来初始化对象:

template<typename T>
struct A { T t; };

int main() {
   A a{.t=1};   //#1: ok in GCC and MSVC
   A b{.t={1}}; //#2: ok in MSVC only
}
Run Code Online (Sandbox Code Playgroud)

第一种方式被 GCC 和 MSVC 接受,而第二种方式仅适用于 MSVC,但 GCC 会打印错误:

error: class template argument deduction failed:
error: no matching function for call to 'A(<brace-enclosed initializer list>)'
Run Code Online (Sandbox Code Playgroud)

演示: https: //gcc.godbolt.org/z/PaEaMjM7q

哪个编译器是正确的?

son*_*yao 5

海湾合作委员会是正确的。Braced-init-list 之类{1}没有类型,因此它会使模板参数推导失败。

非推导上下文

...

参数 P,其 A 是a braced-init-list, but P is not std::initializer_list, a reference to one (possibly cv-qualified), or (since C++17)对数组的引用: