대답하는 과정에서 또 다른 질문 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을 제출했습니다 .