development

std :: vector :: erase () 및 std :: deque :: erase ()의 할당 복사 / 이동

big-blog 2020. 6. 26. 07:46
반응형

std :: vector :: erase () 및 std :: deque :: erase ()의 할당 복사 / 이동


대답하는 과정에서 또 다른 질문 I가 약간 다른 원문 우연히 std::vector::erase()std::deque::erase().

이것이 C ++ 14가 std::deque::erase( [deque.modifiers]/4-6, 강조 광산)에 대해 말한 것입니다.

효과 : ...

복잡성 : 소멸자에 대한 호출 수는 지워진 요소 수와 동일하지만 대입 연산자 에 대한 호출 수는 요소 수보다 작거나 같지 않습니다. 지워진 요소.

예외없는 : 아무것도 예외가의 복사 생성자, 이동 생성자, 대입 연산자, 또는 이동 할당 연산자에 의해 발생하지 않는 한 T.

다음은 std::vector::erase( [vector.modifiers]/3-5) 에 대한 내용입니다 .

효과 : ...

복잡성 : 소멸자 T횟수라고 소거 요소들의 수와 동일하지만, 이동 할당 연산자T횟수라고는 소거 요소 후의 벡터의 요소들의 수와 동일.

예외없는 : 아무것도 예외가의 복사 생성자, 이동 생성자, 대입 연산자, 또는 이동 할당 연산자에 의해 발생하지 않는 한 T.

보시다시피, 둘 다에 대한 예외 사양은 동일하지만 std::vector이동 할당 연산자가 호출되었다고 명시 적으로 언급되어 있습니다.

거기에 대한 요구 사항이기도 T할 수 MoveAssignable에 대해 erase()모두 작업을 std::vector하고 std::deque(표 100)는, 그러나 이것은 이동 할당 연산자의 존재를 의미하지 않습니다 하나는 복사 할당 연산자를 정의하고, 이동 할당 연산자를 정의하지,이 클래스는 것입니다 수 있습니다 수 MoveAssignable.

경우에 따라 GCC와 Clang을 확인하고 실제로 std::vector::erase()이동 할당 연산자가 없으면 복사 할당 연산자를 호출 std::deque::erase()하고 동일한 작업을 수행합니다 ( DEMO ).

그래서 질문은 : 내가 뭔가를 놓쳤습니까, 아니면 표준의 (편집) 문제입니까?

업데이트 : LWG 문제 # 2477을 제출했습니다 .


Lenexa 회의에서 문제 제안 된 해결 방법으로 즉시 상태얻었습니다 .

이 표현은 N4296과 관련이 있습니다.

23.3.3.4 [deque.modifiers] / 5를 다음과 같이 변경하십시오.

-5 복잡성 : 소멸자 T 대한 호출 수는 지워진 요소 수와 동일하지만 할당 연산자 T 대한 호출 수는 지워진 요소 이전의 요소 수보다 작거나 지워진 요소 다음의 요소 수

23.3.6.5 [vector.modifiers] / 4를 다음과 같이 변경하십시오.

-4- 복잡성 : 소멸자는 T소거 된 요소의 수와 같은 횟수라고하지만 이동 할당 연산자 T는 소거 된 요소 다음의 벡터에있는 요소의 수와 같은 횟수라고합니다.

즉, 해상도가 승인되면에 대한 이동 할당에 대한 특별한 언급이 없으며에 std::vector::erase대한 문구 std::deque::erase가 약간 명확해질 것입니다.

참고 URL : https://stackoverflow.com/questions/28277982/copy-move-assignment-in-stdvectorerase-and-stddequeerase

반응형