【发布时间】:2019-07-10 20:54:43
【问题描述】:
我有以下代码,其中我使用折叠表达式来评估是否所有包参数都可以转换为第一个函数参数。由于某种原因,当我进行看似非常微不足道的更改时,它无法在 msvc 上编译:
#include <type_traits>
#define TRY 1
#if TRY == 1
template<typename B, typename... Args,
std::enable_if_t<((std::is_convertible_v<Args&, B&> && ...)), bool> = true>
void fn(B b, Args...args) {}
#else
template<typename B, typename... Args,
typename = std::enable_if_t<(std::is_convertible_v<Args&, B&> && ...)>>
void fn(B b, Args...args) {}
#endif
int main()
{
fn(5, 4, 2);
return 0;
}
将TRY 更改为0 进行编译,演示地址:https://godbolt.org/z/EGvQ-N
我遗漏的两个变体之间是否存在重要区别,或者这是编译器错误?
【问题讨论】:
-
我相信这是 MSVS 的解析问题。一两个月前有一个这样的问题,我会尝试查找,看看是否发现了这个问题
-
好吧,我找到了post I was thinking of,但它使用的是数组而不是折叠表达式。可能是同一个问题,也可能不是。
-
@NathanOliver 那是一年前的事了,即使是同一个问题,也意味着要么没有报告,要么他们没有修复它。我向 MS 提交了错误报告,希望他们能修复它。
-
那是上个月的。 6 月 18 日不是 2018 年 6 月,而是 6 月 18 日。
-
如果是从去年 6 月 18 日开始,则应该是 2018 年 6 月 18 日。
标签: c++ templates c++17 enable-if fold-expression