C++ 中指定初始值设定项时的模板参数推导
Template argument deduction in case of designated initializers in C++
在以下代码中,使用两种略有不同的形式的指定初始值设定项,使用模板参数推导对 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
}
GCC 和 MSVC 都接受第一种方式,而第二种方式仅适用于 MSVC,但 GCC 会打印错误:
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}
这样的 Braced-init-list 没有类型,所以它使 template argument deduction 失败。
Non-deduced contexts
...
The parameter P, whose A is a braced-init-list, but P is not std::initializer_list, a reference to one (possibly cv-qualified), or (since C++17)
a reference to an array:
在以下代码中,使用两种略有不同的形式的指定初始值设定项,使用模板参数推导对 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
}
GCC 和 MSVC 都接受第一种方式,而第二种方式仅适用于 MSVC,但 GCC 会打印错误:
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}
这样的 Braced-init-list 没有类型,所以它使 template argument deduction 失败。
Non-deduced contexts
...
The parameter P, whose A is
a braced-init-list, but P is not std::initializer_list, a reference to one (possibly cv-qualified), or (since C++17)
a reference to an array: