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
,因为符号>
被解释为结束的尖括号。
我无法找到有关哪些表达式可以用作模板参数的资源。 那么哪些表达式是被允许的,哪些不被允许呢? 标准是否禁止任何非其他模板实例化表达式,而编译器还是会允许一些呢?
/std:c++latest
进行编译。 - NathanOliverstd::enable_if_t< (x>y), int>
。 - Drew Dormann