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++14(builder-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之前还不行,但是编译成功了,并且代码似乎在做应该做的事情。我期望编译会失败。
关于为什么编译器接受我的折叠表达式的任何解释?
合格的C ++ 17编译器必须提供折叠表达式。但这是一个有用的语言功能,是否仅因为您在以前的语言模式下进行编译就值得将其禁用?
允许实现提供扩展,只要它们不改变格式正确的程序的行为([intro.compliance] / 8)。C ++ 17之前的折叠表达式就是这样的扩展-它们纯粹是加法运算。因此,在C ++ 14模式下,在允许和禁止折叠表达式之间进行实用程序权衡时,gcc和clang似乎都倾向于允许。
当然,您不应该依赖于此-如果您想编写C ++ 17代码,则应该使用C ++ 17进行编译。如果您需要帮助,可以使用-pedantic-errors:
每当基本标准(请参阅参考资料
-Wpedantic)需要诊断时,在某些情况下(在编译时存在未定义的行为)以及在某些其他情况下,这些错误不会阻止编译符合该标准的有效程序时,请给出错误。这不等于-Werror=pedantic,因为此选项启用了错误,而该选项未启用,反之亦然。