【发布时间】: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<x > y, int> = 0,因为> 被解释为一个右尖括号。
我根本找不到关于哪些表达式可以作为模板参数的资源。 那么哪些表达式是允许的,哪些是不允许的呢? 标准是否禁止除其他模板实例化之外的任何表达式,而编译器无论如何都允许某些表达式?
【问题讨论】:
-
看起来它可能是一个错误。 It compiles using
/std:c++latest -
在任何编译器上,
std::enable_if_t< (x>y), int>都需要括号
标签: c++ templates syntax compiler-errors fold-expression