何时可以将折叠表达式用作模板参数?

3

I have the following code:

#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上报错

(9): error C2059: syntax error: '...'

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

我无法找到有关哪些表达式可以用作模板参数的资源。 那么哪些表达式是被允许的,哪些不被允许呢? 标准是否禁止任何非其他模板实例化表达式,而编译器还是会允许一些呢?


3
看起来可能是一个错误。使用/std:c++latest进行编译 - NathanOliver
在任何编译器上,您都需要使用括号来写std::enable_if_t< (x>y), int> - Drew Dormann
1个回答

1
使用 /std:c++latest 而不是 /std::c++17
看起来像是 MSVC 的 bug。
模板参数有点奇怪,但不是那么奇怪。在某些情况下声明 lambda 有限制,但大多数其他内容都是“常量表达式”和类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接