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

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

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



답변

다니엘 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) 최적화와 유사한 것으로 생각할 수 있습니다.


답변