我有以下代码:
#include <type_traits>
template <typename... Args, std::enable_if_t<(std::is_same_v<int, Args> && ...), int> = 0>
void foo(Args ...args);
template <typename T>
struct Type {
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
,因为
>
被解释为结束尖括号。
我根本找不到关于哪些表达式可以作为模板参数的资源。
那么,哪些表达式是允许的,哪些是不允许的?
该标准是否禁止除其他模板实例化之外的任何表达式,编译器是否允许某些其他方式?