代码之家  ›  专栏  ›  技术社区  ›  Jan Schultke

何时允许折叠表达式作为模板参数?

  •  2
  • Jan Schultke  · 技术社区  · 4 年前

    我有以下代码:

    #include <type_traits>
    
    // ok
    template <typename... Args, std::enable_if_t<(std::is_same_v<int, Args> && ...), int> = 0>
    void foo(Args ...args);
    
    template <typename T>
    struct Type {
    
        // syntax error
        template <typename... Args, std::enable_if_t<(std::is_same_v<int, Args> && ...), int> = 0>
        Type(Args ...args);
    
    };
    

    这段代码在GCC上编译得很好,但是 MSVC reports :

    (9) :错误C2059:语法错误:“…”

    显然,MSVC不介意在类外的模板参数中折叠表达式,但在类内则不行。 另一个不起作用的例子是 std::enable_if_t<x > y, int> = 0 ,因为 > 被解释为结束尖括号。

    我根本找不到关于哪些表达式可以作为模板参数的资源。 那么,哪些表达式是允许的,哪些是不允许的? 该标准是否禁止除其他模板实例化之外的任何表达式,编译器是否允许某些其他方式?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Yakk - Adam Nevraumont    4 年前

    使用 /std:c++latest /std::c++17 .

    它看起来像MSVC漏洞。

    模板参数有点奇怪,但不是 那个 奇怪的在某些情况下,声明lambda是有限制的,但其他大部分内容都是“常量表达式”和类型。

    推荐文章