C++ 启用\u if\u t中的折叠表达式出现编译器错误

C++ 启用\u if\u t中的折叠表达式出现编译器错误,c++,templates,c++17,enable-if,fold-expression,C++,Templates,C++17,Enable If,Fold Expression,我有下面的代码,其中我使用折叠表达式来计算是否所有的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&&g

我有下面的代码,其中我使用折叠表达式来计算是否所有的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 1
#如果TRY==1

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

-std::如果\u t=true,则启用\u>
+std::如果\u t=true>
没错,它更详细,但可能更清楚。我遵从@NathanOliver最初的要求追踪潜在的MSV bug


(本应将此作为注释,但认为代码块更清晰。)

我认为这是MSV的解析问题。一个月或两个月前,有一个像这样的Q,我会试着找到,看看这是否是我找到的,但它使用的是数组而不是折叠表达式。可能是同一个问题,也可能不是。@NathanOliver,那是一年前的问题,即使是同一个问题,也意味着要么没有报告,要么他们没有修复它。我向微软提交了一份错误报告,希望他们能修复。那是上个月的。6月18日并不意味着2018年6月,而是6月18日。如果是从去年6月18日开始的话,它将在2018年6月18日。我最初试图让至少一些东西起作用,这样确实会有很大帮助。不过,我想我会向msvc提交另一个编译器错误(不幸的是,这是本周的第三个)。我发现折叠表达式更清晰。这是一个简单的例子,每个程序员都知道什么是
&&
,但是“连接”需要一些思考,也许需要一些谷歌搜索才能弄清楚。在我看来,
连词
只有在需要短路时才真正值得。@Justin也不是每个程序员都知道折叠表达式是什么。如果有人真的不知道什么是连词,那么不管用哪种方法查找都是个好主意。我的观点是,这是主观的,看起来更好。我喜欢折叠,只是因为我习惯了Haskell,我不喜欢太多的
,但这并不是说它优于其他变体。