2012-02-12 4 views
13

나는 이동 생성자/할당이 던져 지도록 허용되는지 여부와 관련하여 몇 가지 모순되는 기사를 읽었습니다.이동 생성자는 noexcept 여야합니까?

따라서 이동 생성자/할당이 최종 C++ 11 표준을 던질 수 있는지 여부를 묻고 싶습니다.

+0

이동 생성자가 던져 넣을 수없는 것에 대해서는 표준에서 아무것도 보지 못했지만 "클래스 X에 대한 암시 적으로 선언 된 이동 생성자는 다음 형식을 갖습니다. 'X :: X (X &&)' "나는 거기에'noexcept'를 보지 않습니다. –

+0

최종 초안에서 어떤 함수로 선언 된'noexcept'도 보지 못했습니다 ... – ronag

+0

@ronag : 정말입니까? 왜냐하면 N3337을 열었고 "noexcept"를 검색했기 때문에 즉시 클래스의 'swap'기능을 갖게 되었기 때문입니다. –

답변

17

이동 생성자는 일반적으로 throw 할 수 있습니까? 예. 해야합니까? 번호 :

일반적으로 사용자가 수행 할 수있는 일은 아무 것도 없습니다. 메모리 할당, 다른 코드 호출 등을해서는 안됩니다. 이동 생성자를 작성하는 유일한 이유는 다른 누군가의 메모리 포인터와 객체 참조를 무시하는 것입니다. 몇 가지 기본 유형을 복사하고 다른 객체의 값을 무효화해야합니다. 그런 것들은 버려서는 안됩니다.

허용되는 동안 좋은 생각이 아닙니다. 당신이 그것을하고 있다면, 당신의 이동 작업에서 뭘하고 있는지 다시 생각해보십시오.

+0

이동 생성자에서 stl 형식을 throw한다고 가정하지 않습니까? 내가 걱정해야 할 유일한 곳은 USD 다. – ronag

+6

@ronag : std :: type에 이동 생성자에 noexcept가 없으면 throw 할 수 있습니다. 특히 노드 기반 컨테이너의 일부 구현에는 던진 이동 생성자가 있습니다. 각 컨테이너에는 힙 할당 끝 노드, 즉 빈 컨테이너가 있어야하기 때문입니다. 이러한 동일한 컨테이너의 다른 구현에는이 디자인이 없으므로 noexcept 이동 생성자가있을 수 있습니다 (허용됩니다). –