1

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

更改TRY0让它编译,演示在:https ://godbolt.org/z/EGvQ-N

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

4

1 回答 1

3

冒着偏离主题的风险,我不确定折叠表达式是这里的最佳选择。我鼓励您使用std::conjunctionMSVS 支持的变体:

- 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 错误。

(会将此作为评论,但认为代码块更清晰。)

于 2019-07-10T21:12:38.700 回答