【问题标题】:When are fold expressions as template parameters allowed?什么时候允许折叠表达式作为模板参数?
【发布时间】:2021-05-10 04:54:44
【问题描述】:

我有以下代码:

#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&lt;x &gt; y, int&gt; = 0,因为&gt; 被解释为一个右尖括号。

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

【问题讨论】:

标签: c++ templates syntax compiler-errors fold-expression


【解决方案1】:

使用/std:c++latest 而不是/std::c++17

它看起来像一个 MSVC 错误。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    相关资源
    最近更新 更多