최근에 나는 noexcept
예외 사양에서 simple question이 될 것이라고 생각했던 답변에 노력했습니다. 결과적으로 나는 noexcept
의 근본적인 이해가 잘못되었다는 것을 알게되었습니다.noexcept 및 안정성 보장
오해를 바로 잡기 위해 the current draft standard을 읽는 동안 here에 대한 답변이없는 noexcept
에 대해 몇 가지 질문을했습니다.
noexcept
은 안전 보장으로 간주해야합니까? 호출 할 때 함수가 throw되지 않고 상태가 손상되지 않습니까?- (1)이 거짓이라고 가정합니다. 휴대 전화 FailFast으로
noexcept
을 사용하여 저장된 상태가 손상되지 않도록 정리하지 않고 응용 프로그램을 종료하는 것이 맞습니까? (2)에
명확한 설명 : 목적은뿐만 아니라 그 안에 긴장을 풀기 방지하기 위해 noexcept
에서 스택까지 더 소멸자 호출을 방지하는 것입니다. 이것은 완벽한 RAII 환경이고 스택을 소멸시키는 사람이 전역 상태를 지속성으로 플러시하여 손상시킬 수 있다는 가정에 기반합니다. 미리 형성되지 않은 방법 풀기의
예 :
#include <iostream>
#include <exception>
namespace{
struct foo{
void change_state() noexcept
{
// change state and fail
throw std::exception();
}
~foo(){
std::cout << "Destructor called, saved state corrupted!" <<std::endl;
}
};
}
int main(){
::std::set_terminate([](){
std::cout<< "Terminate called" <<std::endl;
});
foo f;
f.change_state();
return 0;
}
내가 '예외 없음'을 이해함에 따라 :이 문제가 발생하더라도 나는 그것에 대해 알고 싶지 않습니다. 그래서 "안전"또는 "정확함"을 위해 실제로 작동하지 않습니다. 예외가 발생하지 않도록하여 작동하므로 프로그램이 종료되지 않습니다. – user2485710
예외가'noexcept'로 표시된 함수의 가장 바깥 쪽 블록에 도달하면'std :: terminate'가 호출됩니다. 예외를 전혀 억제하지는 않습니다. 그것은 예외가 던져 질 수없는 장벽을 제공합니다. – Mgetz
전에 썼던 것은 _runtime_에 관한 것이고, 'noexcept'는 컴파일 타임에 작동합니다. 그래서 컴파일러에 대한 힌트이고 컴파일러는 프로그램을 평가하고 무언가가 던져 질 가능성이 있다면 , 당신은'noexcept' 연산자가 _compile time_에 실패하기 때문에 _runtime_ 전에 이것을 수정할 기회가 있습니다. 어떤면에서'형질 형 '처럼 작동합니다. 컴파일러가 경고하지 않으면,'true'로 평가되어야하는 프로퍼티를 정의합니다. 테스트가 _runtime_에 당신의 타입이 '형질'조건. 'noexcept'도 마찬가지입니다. – user2485710