在下面的代码中有一个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
哪个编译器就在那里?
GCC是正确的。像{1}
这样的带括号的init列表没有类型,因此它会导致模板参数推断失败。
非推导上下文
...
参数P,其A是一个带括号的初始化列表,但P不是std::initializer_list,是对一个(可能是cv限定的)的引用,或者(因为C17)
是对数组的引用: