什么时候允许折叠表达式作为模板参数?

When are fold expressions as template parameters allowed?

我有以下代码:

#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): error C2059: syntax error: '...'

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

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

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

它看起来像一个 MSVC 错误。

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