簡體   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