IT박스

std :: ssize ()가 C ++ 20에 도입 된 이유는 무엇입니까?

itboxs 2020. 9. 4. 07:03
반응형

std :: ssize ()가 C ++ 20에 도입 된 이유는 무엇입니까?


C ++ 20std::ssize() 은 아래와 같이 무료 기능을 도입했습니다 .

template <class C>
    constexpr auto ssize(const C& c)
        -> std::common_type_t<std::ptrdiff_t,
                              std::make_signed_t<decltype(c.size())>>;

가능한 구현은를 사용하여 cl ass C 멤버 함수의 static_cast반환 값을 서명 된 대응 항목 으로 변환하는 것 같습니다 .size()

size()C 멤버 함수는 항상 음이 아닌 값을 반환 하기 때문에 서명 된 변수에 저장하려는 사람이있는 이유는 무엇입니까? 정말로 원하는 경우에는 간단 static_cast합니다.

std::ssize()C ++ 20에 도입 된 이유는 무엇 입니까?


근거는 이 백서에 설명되어 있습니다. 인용문 :

span이 C ++ 17에 채택되었을 때 인덱스와 크기 모두 부호있는 정수를 사용했습니다. 부분적으로 이것은 컴파일 타임에 크기가 알려지지 않은 유형을 나타 내기 위해 센티널 값으로 "-1"을 사용할 수 있도록하기위한 것입니다. 그러나 size () 함수가 부호있는 값을 반환하는 STL 컨테이너를 갖는 것은 문제가 되었기 때문에 문제를 "수정"하기 위해 P1089가 도입되었습니다. 다수의지지를 받았지만 합의에 필요한 2 대 1 마진은받지 못했습니다.

이 논문 P1227은 비 멤버 std :: ssize 및 멤버 ssize () 함수를 추가하기위한 제안이었습니다. 이들을 포함하면 특정 코드가 훨씬 더 간단 해지고 크기 계산에서 원치 않는 무 부호화를 방지 할 수 있습니다. 아이디어는 ssize ()가 std :: ssize ()를 통해 그리고 멤버 함수로 모든 컨테이너에 대해 사용 가능 해지면 P1089에 대한 저항이 감소한다는 것입니다.


Eric Niebler에게서 무상으로 도난 당했습니다.

'Unsigned types signal that a negative index/size is not sane'STL이 처음 설계되었을 때 지배적 인 지혜였습니다. 그러나 논리적으로 많은 것들이 긍정적일 필요는 없습니다. 컬렉션에서 추가되거나 제거 된 요소의 수를 나타 내기 위해 부호있는 정수로 카운트를 유지하고 싶을 수 있습니다. 그런 다음 그것을 컬렉션의 크기와 결합하고 싶습니다. 컬렉션의 크기가 서명되지 않은 경우 이제 버그 팜인 서명 된 산술과 서명되지 않은 산술을 혼합해야합니다. 컴파일러는 이것에 대해 경고하지만 STL의 디자인은 프로그래머에게이 상황을 강요하기 때문에 경고가 너무 흔하여 대부분의 사람들이 꺼집니다. 이것은 실제 버그를 숨기기 때문에 부끄러운 일입니다.

인터페이스에서 서명되지 않은 int를 사용하는 것은 많은 사람들이 생각하는 혜택이 아닙니다. 실수로 사용자가 약간 음수를 API에 전달하면 갑자기 큰 양수가됩니다. API가 숫자를 서명 된 것으로 취했다면 숫자가 0보다 크거나 같다고 주장하여 상황을 감지 할 수 있습니다.

서명되지 않은 int의 사용을 비트 트위들 링 (예 : 마스크)으로 제한하고 서명 된 int를 다른 곳에서 사용하면 버그가 발생할 가능성이 적고 버그가 발생할 때 감지하기가 더 쉽습니다.

참고 URL : https://stackoverflow.com/questions/56217283/why-is-stdssize-introduced-in-c20

반응형