指向同一内存的两个 s 的比较begin()
和迭代器是否定义明确?end()
std::span
#include <span>
#include <cassert>
int main() {
int arr[5]{1,2,3,4,5};
std::span s1{arr};
std::span s2{arr};
assert(s1.begin() == s2.begin());
assert(s1.end() == s2.end());
assert(s1.begin() + s1.size() == s2.end());
}
到目前为止,所有断言都传递了所有实现std::span
,但是我是否遗漏了什么,从而导致出现错误,例如 UB?
就上下文而言,如果您有一个试图用跨度隐藏其内部的类,则可能会出现这种情况。
class some_class
{
public:
std::span<int> vec_view() { return vec; }
private:
std::vector<int> vec;
};
int main() {
some_class c;
std::for_each(c.vec_view().begin(), c.vec_view().end(), [](auto&){});
}
这与当一个跨度是另一个跨度的子跨度时,C++ 是否允许在 std::span::iterators 之间进行比较?有关,但这个问题与 无关std::subspan
,而且该std::span
版本还通过了 MSVC 断言,与 的版本不同std::subspan
。