2015-06-24 70 views
5

Scott Mayers的「Effective Modern C++」中的第13項聲明優先於const_iterators而不是迭代器。我同意,但我也想使用非成員函數而不是成員函數。根據該書,在C++ 14中應該有一個非成員函數std::cbegin()std::cend()在C++中支持`std :: cbegin()`14

爲了使用這個功能,我剛剛安裝了gcc版本4.9.2並編譯了標誌-std=c++14。它似乎編譯,直到我嘗試使用std::cbegin()。我開始尋找對這個功能的支持,但是找不到任何關於它的東西。例如,在gnu onlinedocs status這個函數甚至沒有提及。

我的問題是,將std::cbegin()std::cend()確實在C++ 14中支持或者這是本書中的錯誤?如果它將成爲C++ 14的特性,那麼是否有編譯器已經支持這些功能,何時gcc會支持它?

關於begin(),在SO上有很多問題,但這些問題是關於成員函數或關於constexpr- ness而不是關於非成員變體的支持。

回答

1

GCC 4.9對C++ 14的支持是實驗性的和不完整的。但是here,你可以看到,

全局函數CBEGIN,CEND,rbegin,撕裂,crbegin和crend的範圍內獲得容器,數組和初始化列表。

被添加到GCC 5.1中。

2

是的,他們在C++ 14中。它們是由library issue添加的,而不是紙,它看起來像libstdC++的手冊頁不會跟蹤庫問題。

它們在GCC 5.1中實現。見GCC bug 64656

+0

這是我的建議。只有我自己沒有寫,因爲它應該由委員會的一些成員代替我寫。 :) –

1

是的,cppreference沿着begin/end描述了它們。

而該標準在24.7 - Range access中定義了它。我不是在引用它,因爲它是一組與上述鏈接一致的模板函數定義。

草案,這應該是非常接近最終版本(我不記得的最後草案,遺憾的號碼):http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf

由於事實上,你可以用內置的實例上播放cppreference,然後更改beginend調用cbegin/cend並嘗試運行它們。 gcc 4.9抱怨,雖然gcc 5.1已經工作,以及clang 3.6。所以這只是編譯器支持的問題。

相關問題