C++ 复制初始化的默认模板参数推断

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

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 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很好。我会更新答案。