提问者:小点点

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


在下面的代码中有一个A的初始化

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
}

第一种方法被GCC和MSVC接受,而第二种方法仅在GCC打印错误时适用于MSVC:

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

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

哪个编译器就在那里?


共1个答案

匿名用户

GCC是正确的。像{1}这样的带括号的init列表没有类型,因此它会导致模板参数推断失败。

非推导上下文

...

参数P,其A是一个带括号的初始化列表,但P不是std::initializer_list,是对一个(可能是cv限定的)的引用,或者(因为C17)是对数组的引用: