何时允许折叠表达式作为模板参数?

问题描述

我有以下代码

#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,int> = 0>
    Type(Args ...args);

};

这段代码在 GCC 上编译得很好,但是 MSVC reports:

(9): 错误 C2059: 语法错误: '...'

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

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

解决方法

使用 /std:c++latest 而不是 /std::c++17

它看起来像一个 MSVC 错误。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...