C++ 17將(可能)relax the definition of the range for loop,允許end()
返回一個不同的類型(例如定點):便攜地支撐鬆弛範圍-for循環
struct MyRange {
struct Sentinel {};
int* begin();
Sentinel end();
};
bool operator!=(int*, MyRange::Sentinel);
目前支持此唯一的編譯器的gcc 6.1和鐺4.0+(example)(example of error message)。如果我正在編寫一個範圍類型,其中標記對於最終類型更有效,那麼如何檢測編譯器是否支持輕鬆範圍?我在P0184R0中看不到有關這方面的任何討論(上面鏈接);將提供一個功能測試宏?
的其他問題:
- 如果沒有檢測到編譯器支持的一種方式,它是安全(對於庫)改變我
end()
成員函數的返回類型?我是否需要使我的哨兵隱式轉換爲我的迭代器類型?相反,對於C++ 17之前的編譯器,值得以不同的名稱公佈我的哨兵(例如sentinel()
)?預C++ 17算法能否有效地使用[begin(), sentinel())
還是不值得額外的代碼?
根據[P0096R3](http://wg21.link/p0096r3),你可以檢查'__cpp_range_based_for'是否大於或等於201603. – cpplearner
@carrarner啊,當然。請做出答案,我會接受它。 – ecatmur