2017-01-07 6 views
2

"Effective Modern C++"의 항목 14에서는 예외를 방출하지 않을 때마다 함수 noexcept을 선언 할 것을 권장합니다. 매우 작은 사유로 throw 할 수없는 여러 소규모 멤버 함수가있는 클래스가 있습니다. POD에 대한 간단한 수학 연산 만 수행합니다. 그러한 함수를 선언해야합니까? noexcept? 컴파일러조차도 던질 가능성이 없다는 것을 확실하게 감지 할 수있을 때 과도한 것처럼 보입니다.분명히 던질 수없는 간단한 함수에 noexcept를 사용해야합니까?

편집 : 내 질문을 다소 명확히하기 위해 this 질문에 주어진 조언은 "함수가 결코 throw되지 않는다는 것이 명백 할 때 사용하는 것"입니다. 그러나 함수가 결코 던지지 않을 것이 확실하다면 (컴파일러에게조차도) 왜 noexcept을 사용해야합니까? 압도적 인 다수의 기능을 내 프로그램 인 noexcept으로 표시해야 할 것입니다. 이는 설득력있는 이유가있을 경우에만 수행 할 것입니다.

+0

@JesperJuhl 나는 그 질문을 보았지만 아무런 근거도 제시하지 않고 "함수가 결코 던지지 않을 것"이라면 조언을 줄여 도움이되는 것을 찾지 못했습니다. 함수가 던지지 않는 것이 확실하다면 왜 noexcept를 추가해야할까요? –

+0

이므로 컴파일러에서 명확하지 않을 수 있으며 API 사용자에게 추가 문서를 제공하기 때문입니다. –

+0

@JesperJuhl이 질문을 명확하게하기 위해 편집했지만 컴파일러는 분수, 단순 산술, 루프 등으로 구성되어 있기 때문에 문제의 함수를 던질 수 없습니다. 메모리 할당이나 생각할 수있는 사항은 없습니다. 던지다. –

답변

1

하지만 함수가 던지지 않을 것이 확실하다면 (noexcept를 사용하는 이유는 무엇입니까?)

이 지식은 기능의 정의을 알면 추측 할 수 있습니다. 호출자는 선언을 포함하는 머리글 만 포함 할 가능성이 높습니다. 정보가 없습니다. 가장 좋은 기회는 링크 시간 최적화 도구가 암시 적 noexcept 속성을 감지하고 예외 처리를 제거한다는 것입니다 (컴파일러가 실제로이 작업을 수행하는지에 대한 확신이없는 이론적 인 고려 사항에 대해서만 말합니다).

물론 이것은 여러 상황에서 가능하지 않습니다. 예를 들어 개체를 다형성으로 사용하는 경우입니다. 구현이 implicity noexcept 임에도 불구하고 하위 클래스의 함수가 매우 잘 던질 수 있습니다.

부업으로, 평생은 일반적으로 noexcept 없이는 멋지고 멋쟁이입니다. 특별한 이유가 없다면, 예를 들어. 공용 API, 성능에 민감한 긴밀한 루프, 코딩 표준 등을 생략 할 수 있습니다. 마이크로를 최적화하거나 시간을 낭비하지 마십시오.