std :: span에 비교 연산자가없는 이유는 무엇입니까?


10

/ / 일반 배열std::span의 하위 영역에 대한 간단한 참조로 설계 되지 않았습니까 ? API에 비교 연산자를 포함시키기 위해 비교 연산자를 포함해서는 안됩니까? 배제에 대한 추론은 무엇입니까?std::vectorstd::array

참고 : 비교 연산자에 의해, 나도 전체 집합을 의미한다 ( <, <=, ...) 또는 우주선<=>


좋은 질문 IMO, 같은 궁금해. operator==누락되었습니다. Esp. 벡터의 경우 종종 직접 비교하는 것이 편리하다는 것을 알았습니다. 확실하지 않지만 정적 크기 범위 유형에 어려움이있을 수 있습니다.
darune

그것은 std :: span의 버전이 포함되지 않은 gsl :: span처럼 보입니다.
darune

1
@DanielLangr 왜 어휘 비교를 좋아 std::vector하고 std::array하지 않습니까? 그것들은 이미 그 유형에 대해 그렇게 정의되었으므로 여기서는 안됩니다.
Timo

2
참고 P0122R7가 에 대한 비교를 제안 span하지만, 현재의 초안 표준 을 포함하지 않습니다.
Daniel Langr

1
@darune는 gsl::span 않습니다 (항상 않았다) 비교 연산자가 있습니다. 그들은 방금 그들 자신 의 헤더
Barry

답변:


3

다니엘 Langr가 지적한 바와 같이 , std::span초기 제안에 비교 연산자를 가지고 P0122 . 그런 다음 N4791 작업 초안 이후이 연산자를 제거 하고 그 이유는 P1085나와 있습니다.

간단히 말해서 copy와 const std::span는 "shallow"입니다 (즉 std::span, 복사는 기본 요소를 복사 std::span하지 않으며 const 는 기본 요소를 수정 하지 못함을 의미 합니다). 존재하는 경우 비교도 "shallow" 일관성을 위해.

이 백서는 다음과 같은 예를 제공합니다.

예 1 :

T oldx = x;
change(x);
assert(oldx != x);
return oldx;

예 2 :

void read_only(const T & x);

void f()
{
  T tmp = x;
  read_only(x);
  assert(tmp == x);
}

이 예제의 어설 션은 if T = std::span인 경우 실패 할 수 있지만 일반 유형에는 적용되지 않습니다.

하나는이 주장 할 수 std::string_view얕은 복사 할 수 있지만 깊이 비교를 가지고있다. P1085에도 이에 대한 설명이 있습니다.

string_view그러나이 string_view요소는 일치 하지만 해당 요소를 수정할 수 없으므로 얕은 사본은 COW ( string_viewCopy-On-Write) 최적화와 유사한 것으로 생각할 수 있습니다.


문자 배열 소유자가 원본 저장소를 std::string_view가리키는 동안 원본 저장소를 수정하는 것을 막을 수는 없습니다 . 따라서, std::map<std::span<T>, U>으로 깨진 것 std::map<std::string_view, U>입니다. IMHO std::string_view에는 비교 연산자도 포함되어서는 안됩니다.
Lyberta
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.