enable_if_t 中带有折叠表达式的编译器错误

Compiler error with a fold expression in enable_if_t

本文关键字:表达式 错误 折叠 编译器 if enable      更新时间:2023-10-16

>我有以下代码,其中我使用折叠表达式来评估所有包参数是否可以转换为第一个函数参数。由于某种原因,当我进行看似微不足道的更改时,它无法在 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错误。

(本来会把它作为一个注释,但认为代码块更清晰。