繁体   English   中英

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

[英]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之前还不行,但是编译成功了,并且代码似乎在做应该做的事情。 我期望编译会失败。

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

(信贷,信贷是由于:我把灵感来自于这个问题,我可以检查是否所有Tbool类似建议什么这里

合格的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM