2017年6月,GCC 7.1 對於 C++17 標準的支持情況如何了?

g++ 7.1.1 發布已經有兩周余的時間,宣稱對C++17具備完全支持

GCC 7 Release Series


這事情gcc官方就有列表C++ Standards Support in GCC

但其實從以前的一些版本來說,語言核心不是問題,問題是libstdc++。想想regex花了多久才進去吧。這個也有列表Chapter 1. Status

還有一個庫相關的問題需要注意。為了向下兼容,libstdc++並沒有刪掉auto_ptr、random_shuffle、unary_function、binary_function等。結果就是可能你的程序在g++上可以用-std=c++1z編譯通過,但在msvc上卻沒法用/std:c++17編譯通過。這時候需要注意看出錯信息,如果是因為這些函數的話,就知道原因了。


@d41d8c 所用的結構化綁定聲明在 gcc 7.1 受支持情況比較奇怪,也許來源於某些奇特的遺留代碼。

測試來自此處:[Wandbox]三へ( へ?? ?)へ ???? 。

結構化綁定聲明的介紹見此:

http://zh.cppreference.com/w/cpp/language/structured_binding

簡而言之,這種聲明所聲明的標識符都可當做引用,但 decltype 表現不同。

綁定到副本還是其原對象,取決於是否使用 / 。無 / 則綁定到副本。

所綁定對象分三類:

(1) 內建數組

(2) 類 tuple 類

(3) 公開類

對於情況 (1) ,gcc 7.1 完全支持。

對於情況 (2) ,gcc 7.1 不支持的情況是:

結構化綁定聲明在函數外,且綁定到臨時對象自身(使用 /)。此時發布內部錯誤。

而若聲明在函數內,則能正常支持綁定到臨時對象自身。

對於情況 (3) ,gcc 7.1 不支持的情況是:

結構化綁定聲明自身帶 const/volatile 限定符。此時強制轉到情況 (2) 。

(強制轉到 (2) 的問題來源於 std::tuple_size 對任意 const T, volatile T, const volatile T 存在默認定義,不包含某些頭文件可緩解之。此問題來源不在語核實現而在庫。)

結構化綁定聲明在函數外,且綁定到臨時對象自身。此時發布內部錯誤。

有基類。無論基類是否為空,都不支持。

2017/06/23 的 HEAD 修復了情況 (3) 中限定符導致轉入狀況 (2) 的問題,其餘問題未修復。

相比之下 clang 4.0 完全支持情況 (1) 、(2) ,不支持的僅限於情況 (3) 中的非空基類。

其實這種詭異現象早已有之……

gcc 在函數外把數組類型純右值當成左值,函數內又視為正確的右值。4.7~7.1 均如此,最近的 HEAD 才修復。


#include &

const auto [a] = std::make_tuple(0); // Boom!
auto [b] = std::make_tuple(0); // Boom! * 2

struct X { int a; };
const auto [c] = X{0}; // Boom! * 3
auto [d] = X{0}; // Boom! * 4
int main() {}

這讓我怎麼安利


真心希望基本庫引入網路庫,這樣就不用天天想著多平台適配了。現在還在用C++03 (逃


比如filesystem/memory_resouce還在experimental里(

註:這是7.1.0的事情,不清楚7.1.1有沒有搞好

註:剛又試了下..除了variant/optional/any 能用,boyer_moore/execution/inclusive_scan都不知道在哪


已經用上了GCC7.1,然而寫的C++14,除非標準庫引入網路庫了,要不然,這波升級還是小節奏。


推薦閱讀:

關於VS2015的報錯問題,?
acquire and release semantics in mutex的理解?
貼吧用戶幻之上帝真實的水平怎樣?跟輪子哥比如何?
計算機大牛們,看C++有關書籍是不是一遍就看懂了,總感覺自己笨,有些地方需要看幾遍才懂?

TAG:編程 | 計算機科學 | C | GCC | 編譯器 |