A comparação de iteradores begin()
e de dois s que apontam para a mesma memória está bem definida?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());
}
Todas as afirmações passam em todas as implementações std::span
até agora, mas há algo que eu possa estar esquecendo que torna isso um bug, por exemplo, UB?
Para contextualizar, isso pode ocorrer se você tiver uma classe que tenta esconder seus componentes internos com um span.
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&){});
}
Isso está relacionado a C++ permite comparação entre std::span::iterators quando um span é um subspan do outro?, mas esta questão não é sobre um std::subspan
, e além disso a std::span
versão também passa asserções MSVC, diferente da versão com o std::subspan
.