使用c ++ 14构建时可以使用pack fold表达式(c ++ 17扩展名)

pse*_*ert 2 c++ g++ clang++ c++14 c++17

以下代码包含一个fold表达式,afaiu是c ++ 17的一个功能:

template <typename... T> static bool variable_length_or(const T ... v) {
  return (v || ...);
}

bool foo () {
   return variable_length_or(true, false, true, false);
}
Run Code Online (Sandbox Code Playgroud)

我发现奇怪的是,在使用-std=c++14builder-explorer)进行构建时,g ++和clang ++似乎都很好用。他们确实会发出警告:

<source>:2:16: warning: pack fold expression is a C++17 extension [-Wc++17-extensions]

 return (v || ...);
Run Code Online (Sandbox Code Playgroud)

这在某种程度上表明我正在写的东西在c ++ 17之前还不行,但是编译成功了,并且代码似乎在做应该做的事情。我期望编译会失败。

关于为什么编译器接受我的折叠表达式的任何解释?

(应归功于信誉:我从这个问题中得到了启发,可以检查是否Tbool此处的建议相似)

Bar*_*rry 7

合格的C ++ 17编译器必须提供折叠表达式。但这是一个有用的语言功能,是否仅因为您在以前的语言模式下进行编译就值得将其禁用

允许实现提供扩展,只要它们不改变格式正确的程序的行为([intro.compliance] / 8)。C ++ 17之前的折叠表达式就是这样的扩展-它们纯粹是加法运算。因此,在C ++ 14模式下,在允许和禁止折叠表达式之间进行实用程序权衡时,gcc和clang似乎都倾向于允许。

当然,您不应该依赖于此-如果您想编写C ++ 17代码,则应该使用C ++ 17进行编译。如果您需要帮助,可以使用-pedantic-errors

每当基本标准(请参阅参考资料-Wpedantic)需要诊断时,在某些情况下(在编译时存在未定义的行为)以及在某些其他情况下,这些错误不会阻止编译符合该标准的有效程序时,请给出错误。这不等于-Werror=pedantic,因为此选项启用了错误,而该选项未启用,反之亦然。