c++ - 적절한 - 연산자 오버로딩+
복사 및 스왑 이디엄을 사용하는 대입 연산자에서 noexcept를 사용하는 방법은 무엇입니까? (2)
복사본은 호출자의 호출 측 에서 만들어 지므로 함수가 수행하는 작업의 일부가 아닙니다. 따라서 함수에 의해 제어 될 수 없으므로 noexcept
스펙에이 정보를 포함 할 수 없습니다.
당신이 할 수있는 유일한 일은 그것을 안전하게 플레이하고 noexcept
명세에 두 옵션을 추가하는 것입니다. 물론, 그것은 당신이 약간의 가사를 얻는다는 것을 의미합니다.
이동 할당 연산자는 noexcept (STL 컨테이너에 유형을 저장하는 등)로 선언해야합니다. 그러나 copy-and-swap 관용구는 복사 및 이동 할당 연산자를 단일 코드로 정의 할 수 있습니다. 이 경우 noexcept 지정자로 수행 할 작업은 무엇입니까? 복사본 구성이 실패 할 수는 있지만 noexcept 지정자를 위반할 수 있는지 여부는 의심 스럽습니다.
// Is it correct considering that T copy constructor can throw?
T& operator=(T other) noexcept;
평소대로 는 correct . 내가 원하는 것은 그 요점을 보여주는 코드 조각을 보여주는 것입니다.
#include <iostream>
struct foo {
foo() = default;
foo(const foo&) {
std::cout << "throw\n";
throw 1;
}
foo& operator =(foo) noexcept {
return *this;
}
};
int main() {
foo f, g;
try {
f = g; // throws
}
catch(int) {
std::cout << "catch\n";
}
}
gcc 4.8.1 ( -std=c++11 -Wall -Wextra -pedantic
)으로 컴파일하면 아무 경고도 표시되지 않습니다. 코드를 실행하면 다음과 같은 결과가 출력됩니다.
throw
catch
따라서 복사 생성자는 호출 될 때 throw하지만 operator =()
내부에서는 고려되지 않으므로 noexcept
약속이 수행되었습니다. 그렇지 않으면, catch
인쇄하기 전에 terminate가 호출됩니다.