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


135

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


14
표준의 결함 인 것 같습니다.
Barry

4
^ ack. LWG 문제가 적절합니다.
Columbo

4
일반적으로 표준 초안이 충분합니다. 이것은 당신이 진짜를보고 해야하는 경우 중 하나입니다.
Mark Ransom

3
@MarkRansom std :: dequestd :: vector 표준의 현재 소스 는 질문과 동일하므로 최종 버전이 다를 가능성은 매우 적습니다.
Anton Savin

3
N4141은 N4140과 동일한 문구를 사용합니다.
Brian

답변:


9

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가 약간 명확해질 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.