在enable_if_t

时间:2019-07-10 20:54:43

标签: c++ templates c++17 enable-if fold-expression

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

我缺少的两个变体之间是否存在重要区别,或者这是编译器错误吗?

1 个答案:

答案 0 :(得分:2)

冒着稍微偏离主题的风险,我不确定折叠表达式是否是此处的最佳选择。我鼓励您使用MSVS支持的IEnumerable变体:

.ToList()

是的,它比较冗长,但也许更清晰。我请@NathanOliver按照最初的要求跟踪潜在的MSVS错误。

(本来可以作为注释,但认为代码块更清晰。)