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



c++ map erase (1)

다른 질문 에 대답하는 과정에서 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 경우 이동 할당 연산자가 호출되었다고 명시 적으로 언급되어 있습니다.

erase()std::vectorstd::deque (표 100)와 함께 작동하려면 TMoveAssignable (표 100)이 있지만 이동 할당 연산자가 있음을 의미하지는 않습니다. 복사 할당을 정의 할 수 있습니다. 이동 할당 연산자를 정의하지 MoveAssignable 클래스는 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 대한 문구가 약간 명확 해집니다.





c++14