复制初始化的默认模板参数推导

时间:2018-10-10 22:06:09

标签: c++ c++17 template-deduction

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中有效吗?

1 个答案:

答案 0 :(得分:3)

这是GCC中的错误。

请注意,如果用大括号替换括号,则代码将编译:

ObjectAnimator

这不是类模板参数推导,因为没有要推导的模板参数。类模板参数推导应允许省略模板括号。在这种情况下,auto x2 = X{}; // now compiles in clang and gcc X<> x3 = X{}; // now compiles in clang and gcc ()的使用与推断是否有关系。