C++17 将(可能)relax the definition of the range for loop ,允许 end()
返回不同的类型(例如哨兵):
struct MyRange {
struct Sentinel {};
int* begin();
Sentinel end();
};
bool operator!=(int*, MyRange::Sentinel);
目前唯一支持此功能的编译器是 gcc 6.1 和 clang 4.0+ ( example ) ( example of error message )。如果我正在编写一个范围类型,其中哨兵对于结束类型会更有效,我如何检测编译器是否支持松弛范围?我在 P0184R0(上面链接)中看不到对此的任何讨论;是否会提供功能测试宏?
进一步的问题:
- 如果有检测编译器支持的方法,更改我的
end()
成员函数的返回类型是否安全(对于库)?我需要吗?使我的哨兵隐式转换为我的迭代器类型? - 相反,对于 C++17 之前的编译器,是否值得以不同的名称公开我的哨兵(例如
sentinel()
)? C++17 之前的算法能否有效地使用[begin(), sentinel())
还是不值得额外的代码?
最佳答案
根据 P0096R3 ,您可以检查 __cpp_range_based_fo r
是否大于或等于 201603。当然,Visual Studio 不支持任何功能测试宏,因此您将拥有单独检查其版本控制。他们在 VS2015 Update 3 中提供了对它的支持,但与大多数其他 C++17 支持一起,您必须使用 /std:c++latest
开关。
关于c++ - 可移植地支持宽松的循环范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38957468/