2011-05-15 3 views
15

빠른 참조, 특히 현재 향후 C++ 0x 표준 구현과 관련하여 좋은 참조를 찾을 수 없습니다.생성자 이동 및 강력한 예외 보증

move constructors can throw부터 일부 표준 라이브러리 함수가 강력한 예외 보증을 제공 할 수 없다는 것을 의미합니다 (예 : vector<T>::resize()).

1) 모든 표준 라이브러리 이동 생성자를 "no throw"로 만들고 2) 사용자 코드에 컴파일 시간 검사를 추가하여 예. std::pair<std::string, MyType>은 nothrow move 생성자 또는 move 생성자를 전혀 정의하지 않습니다.

이 제안은 무엇입니까 (특히 this question과 관련)? 최종 초안에서 문제는 어떻게 "해결"됩니까?

최근 GCC 나 MSVC 10을 사용할 때 무엇이 ​​가장 중요합니까? 이러한 표준 라이브러리의 구현은 예를 들어 강력한 예외 보증을 제공합니까? std::vector<MyTypeWithAThrowingMoveConstructor>::resize()?

편집 : 나는 명확하게 관련된 this question을 보지 못했습니다. 내 질문이 복제본이라는 사실에 대한 합의가있는 경우이를 닫습니다. 그러나, 나는 실제로 이 아닌 이 구현 된 것에 관심이있다..

+0

+1 호기심 많은 질문 – sehe

+0

그들은 강력한 예외 보장을 제공 했습니까? 내 말은, 당신의 복사 생성자가 항상 던질 수 있다는 것입니다 ... – Xeo

+0

@Xeo : 예 그들은 그것을했습니다. 모든 복사본이 성공적으로 완료된 후에는 이전 버퍼가 소멸되므로 * 크기 조정 작업을 쉽게 롤백 할 수 있습니다. nothrow move 생성자를 사용하면 요소를 이전 버퍼로 다시 이동하여 롤백 할 수 있습니다. 이동 생성자를 던지면서 나쁜 일이 발생할 수 있습니다. 여기서 우리는 강력한 * noexcept 키워드가 없음을 분명히 알 수 있습니다. –

답변

4

특정 구현을 검사하지는 않았지만 일반적인 개념은 이동 생성자가 throw 할 수있는 경우 벡터가 요소를 대신 복사해야한다는 것입니다. 그렇게하면 예외가 발생할 경우 롤백 할 수 있습니다.

<utility>에 정의 된 도우미 기능 move_if_noexcept도 무엇을 할 것인지 결정하는 데 도움이됩니다.

+0

흥미 롭습니다. 나는이 'move_if_noexcept' (당신이 오타가있을 수 있습니다) 도우미가 내가 관심있는 도서관에 있는지 확인하려고합니다. –

+0

MSVC10에는 없습니다. –

+2

@Alexander - MSVC10은 rvalue 규칙이 출시 된 후 변경되었으므로 완전히 준수 할 수있는 기회가 없습니다. –