【发布时间】:2020-09-27 16:01:32
【问题描述】:
以下代码在c++17中合法吗?
std::vector<int> x{1,2,3};
std::vector<int>::iterator it{};
bool result = x.begin() != it;
以下引自https://en.cppreference.com/w/cpp/named_req/ForwardIterator:
对相同底层序列的所有迭代器和值初始化迭代器定义相等和不等比较
如果我理解正确,比较应该没问题。它似乎适用于 clang 和 gcc,但是当我在调试模式下使用 MSVC 2019 运行它时,我得到一个断言说“向量迭代器不兼容”。
我不是在询问比较的结果,我只对 MSVC 是否符合此处的标准感兴趣。
godbolt 上的实时示例
【问题讨论】:
-
忽略它。 MSVC 试图帮助您避免在调试模式下出错。如果您在发布模式下编译,它不应该出现。
-
@NathanOliver 我不相信这是真的。我认为,您和 OP 误解了(诚然措辞不佳的)cppreference 文本。而且,如果是这样,调试中的断言会令人担忧,因为这表明库 impl 会在发布时将其视为“UB”。
-
@AsteroidsWithWings 我个人很喜欢它的存在。将迭代器与向量进行比较,将迭代器与向量进行比较有什么意义?即使标准说没关系,因为空向量和空迭代器将“指向”同一事物(无),但这样做没有意义。
-
@NathanOliver 没错,这就是为什么标准 不 说没关系 ;) VS 不(不应该)断言有效代码只是为了警告你风格;它断言警告您您违反了一些没有提供实际诊断的标准规则
标签: c++ iterator c++17 language-lawyer undefined-behavior