C ++ 17具有class template argument deduction。但是,我想知道它是否适用于诸如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
}
这里是godbolt link。那么哪个编译器是正确的,并且该程序在C ++ 17中有效吗?
答案 0 :(得分:3)
这是GCC中的错误。
请注意,如果用大括号替换括号,则代码将编译:
ObjectAnimator
这不是类模板参数推导,因为没有要推导的模板参数。类模板参数推导应允许省略模板括号。在这种情况下,auto x2 = X{}; // now compiles in clang and gcc
X<> x3 = X{}; // now compiles in clang and gcc
或()
的使用与推断是否有关系。