[英]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.