C++ 复制初始化的默认模板参数推断
C++17已经实现了。但是,我想知道它是否适用于像C++ 复制初始化的默认模板参数推断,c++,c++17,template-argument-deduction,C++,C++17,Template Argument Deduction,C++17已经实现了。但是,我想知道它是否适用于像auto x=x()这样的语句,其中x是一个类模板。考虑这个代码: template <typename T = void> struct X {}; int main() { // all with -std=c++17 X<> x0; // compiles in both clang and gcc X x1; // compiles in both cl
auto x=x()
这样的语句,其中x
是一个类模板。考虑这个代码:
template <typename T = void>
struct X {};
int main() { // all with -std=c++17
X<> x0; // compiles in both clang and gcc
X x1; // compiles in both clang and gcc
auto x2 = X(); // compiles in clang but not gcc
X<> x3 = X(); // compiles in clang but not gcc
}
模板
结构X{};
int main(){//all带有-std=c++17
xx0;//在clang和gcc中编译
X x1;//在clang和gcc中编译
auto x2=X();//以铿锵而非gcc方式编译
xx3=X();//以铿锵而非gcc的形式编译
}
这是你的电话号码。那么哪个编译器是正确的,这个程序是有效的C++17吗?这是GCC中的一个错误
请注意,如果用大括号替换圆括号,代码将编译:
auto x2 = X{}; // now compiles in clang and gcc
X<> x3 = X{}; // now compiles in clang and gcc
autox2=X{};//现在可以用clang和gcc进行编译
xx3=X{};//现在可以用clang和gcc进行编译
这不是类模板参数推断,因为没有模板参数被推断。类模板参数推断应允许省略模板大括号。在这种情况下,使用()
或{}
与它们是否被推断无关。这是GCC中的一个缺陷
请注意,如果用大括号替换圆括号,代码将编译:
auto x2 = X{}; // now compiles in clang and gcc
X<> x3 = X{}; // now compiles in clang and gcc
autox2=X{};//现在可以用clang和gcc进行编译
xx3=X{};//现在可以用clang和gcc进行编译
这不是类模板参数推断,因为没有模板参数被推断。类模板参数推断应允许省略模板大括号。在这种情况下,使用
()
或{}
与它们是否被推断无关。这些语句都应该格式正确。这是一个gcc错误。@Barry这个错误真的来自类模板参数推断功能吗?我想没有,因为实际上并没有发生扣减。@0x499602D2是的,CTAD是让您编写X代码>而不必编写X代码>@Barry很好。我会更新答案。这些陈述都应该是格式正确的。这是一个gcc错误。@Barry这个错误真的来自类模板参数推断功能吗?我想没有,因为实际上并没有发生扣减。@0x499602D2是的,CTAD是让您编写X代码>而不必编写X代码>@Barry很好。我会更新答案。