C++17 将(可能)放宽循环范围的定义,允许end()
返回不同的类型(例如哨兵):
struct MyRange {
struct Sentinel {};
int* begin();
Sentinel end();
};
bool operator!=(int*, MyRange::Sentinel);
目前支持此功能的唯一编译器是 gcc 6.1 和 clang 4.0+(示例)(错误消息示例)。如果我正在编写一个范围类型,其中哨兵对结束类型更有效,我如何检测编译器是否支持宽松范围?我在 P0184R0(上面链接)中看不到任何关于此的讨论;会提供功能测试宏吗?
进一步的问题:
- 如果有办法检测编译器支持,那么更改
end()
成员函数的返回类型是否安全(对于库而言)?我是否需要让我的哨兵隐式转换为我的迭代器类型? - 相反,对于 C++17 之前的编译器,是否值得以不同的名称(例如
sentinel()
)公开我的哨兵?C++17 之前的算法可以有效地使用[begin(), sentinel())
还是不值得额外的代码?