代码之家  ›  专栏  ›  技术社区  ›  jcai

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

  •  0
  • jcai  · 技术社区  · 6 年前

    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

    1 回复  |  直到 6 年前
        1
  •  3
  •   David G    6 年前

    这是GCC中的一个bug。

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

    auto x2 = X{}; // now compiles in clang and gcc
    X<> x3 = X{}; // now compiles in clang and gcc
    

    这不是类模板参数推断,因为没有正在推导的模板参数。 类模板参数推导应允许省略模板大括号。使用 () {} 在这种情况下,它们是否被推断出来与此无关。