![](/img/trans.png)
[英]What is a good alternative to this C++17 fold expression in C++14?
[英]pack fold expression (c++17 extension) available when building with c++14
以下代码包含一个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);
}
我发现奇怪的是,当使用-std=c++14
( -std=c++14
-explorer )进行编译时,g ++和clang ++似乎都很-std=c++14
。 他们确实会发出警告:
<source>:2:16: warning: pack fold expression is a C++17 extension [-Wc++17-extensions]
return (v || ...);
这在某种程度上表明我正在写的东西在c ++ 17之前还不行,但是编译成功了,并且代码似乎在做应该做的事情。 我期望编译会失败。
关于为什么编译器接受我的折叠表达式的任何解释?
合格的C ++ 17编译器必须提供折叠表达式。 但这是一个有用的语言功能,是否仅因为您在以前的语言模式下进行编译就值得将其禁用 ?
允许实现提供扩展,只要它们不改变格式正确的程序的行为( [intro.compliance] / 8 )。 C ++ 17之前的折叠表达式就是这样的扩展-它们纯粹是加法运算。 因此,作为在C ++ 14模式下允许和禁止折叠表达式之间进行实用程序权衡的问题,似乎gcc和clang都决定倾向于允许。
当然,您不应该依赖于此-如果您想编写C ++ 17代码,则应该使用C ++ 17进行编译。 如果您需要依赖它的帮助,则可以使用-pedantic-errors
进行编译:
每当基本标准(请参见
-Wpedantic
)需要诊断时,在某些情况下(在编译时存在未定义的行为)以及在某些其他情况下,这些情况不会阻止编译符合该标准的有效程序时,请给出错误。 这不等于-Werror=pedantic
,因为此选项启用了错误,而该选项未启用,反之亦然。
如果不添加-ansi -pedantic
来严格遵守该标准,则编译器可以自由采用某些扩展,或者在这种情况下采用以下标准的元素。
-ansi -pedantic
是我为g ++和clang ++添加的选项; 很明显,其他编译器可以使用不同的选项。
-编辑-
正如Barry指出的(谢谢!),- -ansi
不再有用,并且-pedantic
足够-pedantic
。
正如Passer By(感谢!)指出的那样,在不严格遵守的情况下,使用-pedantic-error
可能会施加错误,而不仅是警告,可能会很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.