gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:30:51 27 4
gpt4 key购买 nike

以下代码包含一个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( compiler-explorer)进行构建时,g++和clang++似乎都不错。他们确实会发出警告:
<source>:2:16: warning: pack fold expression is a C++17 extension [-Wc++17-extensions]

return (v || ...);

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

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

(应归功于信贷:我从 this问题中汲取了灵感,可以检查所有 T是否都是 bool类似于建议的 here)

最佳答案

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

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

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

Give an error whenever the base standard (see -Wpedantic) requires a diagnostic, in some cases where there is undefined behavior at compile-time and in some other cases that do not prevent compilation of programs that are valid according to the standard. This is not equivalent to -Werror=pedantic, since there are errors enabled by this option and not enabled by the latter and vice versa.

关于c++ - 使用c++ 14构建时可以使用pack fold表达式(c++ 17扩展名),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58687812/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com