enable_if_t 中带有折叠表达式的编译器错误
Compiler error with a fold expression in enable_if_t
>我有以下代码,其中我使用折叠表达式来评估所有包参数是否可以转换为第一个函数参数。由于某种原因,当我进行看似微不足道的更改时,它无法在 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 支持的 std::conjunction
变体:
- std::enable_if_t<((std::is_convertible_v<Args&, B&> && ...)), bool> = true>
+ std::enable_if_t<std::conjunction_v<std::is_convertible<Args&, B&>...>, bool> = true>
没错,它更冗长,但可能更清晰。 我遵从@NathanOliver,以跟踪最初要求的潜在MSVS错误。
(本来会把它作为一个注释,但认为代码块更清晰。
相关文章:
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- C++ 标记之前预期主表达式'('错误
- 正则表达式中带有卷轴大括号的正则表达式错误
- C++初学者错误:主要表达式错误
- 代数树表达式C++错误:未解析的外部符号"Public:_thiscall AlgebraicTreeExpression::~AlgebraicTreeExpression(void) ..."
- 使用多线程处理对象数组 - 无效使用 void 表达式错误
- 为什么 if constexpr 不会使这个核心常量表达式错误消失?
- 提升正则表达式错误:未初始化的提升::match_results
- C++比较表达式错误
- C++ "主表达式"错误
- C++ 正则表达式错误(未处理的异常)
- 'this'不能用于常量表达式错误 (C++)
- 代码块引发有关for_each的预期主表达式错误
- Boost Regex中的命名子表达式错误
- C++之前的主要表达式错误
- Ubuntu 上的正则表达式错误
- C++正则表达式错误
- 理解常量表达式错误
- 成员函数和预期的主表达式错误
- Xcode中应有表达式错误