나는 이동 생성자/할당이 던져 지도록 허용되는지 여부와 관련하여 몇 가지 모순되는 기사를 읽었습니다.이동 생성자는 noexcept 여야합니까?
따라서 이동 생성자/할당이 최종 C++ 11 표준을 던질 수 있는지 여부를 묻고 싶습니다.
나는 이동 생성자/할당이 던져 지도록 허용되는지 여부와 관련하여 몇 가지 모순되는 기사를 읽었습니다.이동 생성자는 noexcept 여야합니까?
따라서 이동 생성자/할당이 최종 C++ 11 표준을 던질 수 있는지 여부를 묻고 싶습니다.
이동 생성자는 일반적으로 throw 할 수 있습니까? 예. 해야합니까? 번호 :
일반적으로 사용자가 수행 할 수있는 일은 아무 것도 없습니다. 메모리 할당, 다른 코드 호출 등을해서는 안됩니다. 이동 생성자를 작성하는 유일한 이유는 다른 누군가의 메모리 포인터와 객체 참조를 무시하는 것입니다. 몇 가지 기본 유형을 복사하고 다른 객체의 값을 무효화해야합니다. 그런 것들은 버려서는 안됩니다.
허용되는 동안 좋은 생각이 아닙니다. 당신이 그것을하고 있다면, 당신의 이동 작업에서 뭘하고 있는지 다시 생각해보십시오.
이동 생성자에서 stl 형식을 throw한다고 가정하지 않습니까? 내가 걱정해야 할 유일한 곳은 USD 다. – ronag
@ronag : std :: type에 이동 생성자에 noexcept가 없으면 throw 할 수 있습니다. 특히 노드 기반 컨테이너의 일부 구현에는 던진 이동 생성자가 있습니다. 각 컨테이너에는 힙 할당 끝 노드, 즉 빈 컨테이너가 있어야하기 때문입니다. 이러한 동일한 컨테이너의 다른 구현에는이 디자인이 없으므로 noexcept 이동 생성자가있을 수 있습니다 (허용됩니다). –
이동 생성자가 던져 넣을 수없는 것에 대해서는 표준에서 아무것도 보지 못했지만 "클래스 X에 대한 암시 적으로 선언 된 이동 생성자는 다음 형식을 갖습니다. 'X :: X (X &&)' "나는 거기에'noexcept'를 보지 않습니다. –
최종 초안에서 어떤 함수로 선언 된'noexcept'도 보지 못했습니다 ... – ronag
@ronag : 정말입니까? 왜냐하면 N3337을 열었고 "noexcept"를 검색했기 때문에 즉시 클래스의 'swap'기능을 갖게 되었기 때문입니다. –