2012-08-15 2 views
10

합니까 C++ (11)는, inline 함수 나 메소드에 대한 보증을 제공? C++ (11) noexcept 규정 및 인라인 방법

class My_String { ... 

    const char * c_str() const noexcept; 
    inline operator const char *() const { return c_str(); } 
}; 

가 나는 최적화 컴파일러가 전체 EH없이 인라인 방법을 구현하고 noexcept 자격에 따라, 스택 언 와인딩 자유롭게 될 것이다 가정합니다. 나는 또한 너무 단순한 접근 방법이를 기대 :이 예제는 사소한 보이는

... inline operator const char *() const { return m_buffer; } 

동안 다른 클래스 또는 함수를 구현하는 데 사용하는 경우, 예외없이 보장합니다. Q : C++ 11 표준 주소에서이 방법을 사용해야합니까? 예 : noexcept? 또는 이 클래스 또는 기능 사양과 일치하도록이 필요하지 않으면 noexcept을 생략하는 것이 더 낫습니까?

편집 : 약간의 혼동을 피하려면 : noexcept은 인라인 방법에 암시 적입니까?

+1

사용자가 제공 한 코드의 경우 'noexcept'는 간단한 응답으로 소멸자에게만 암시 적입니다. –

+2

후속 질문은 가능하면 ** 하나가'noexcept'를 선언해야 ** – Walter

답변

8

죄송합니다. 유일한 암시 적 예외 사양은

  • 소멸자에 있습니다. 복사 및 이동 생성자, 복사 및 클래스 정의에 선언, 또는 = default;로 선언되지 할당, 이동, 기본 생성자 : 다른에
  • 는 암시 적으로 선언으로 또는 명시 적으로 특별한 멤버 함수를 기본값.
  • 할당 해제 기능 : operator deleteoperator delete[].

예를 들어, noexcept(static_cast<const char*>(std::declval<const MyString>()))false이어야합니다. 계속해서 문제가되는 부분 인 noexcept을 작성하십시오. 당신이 언급 한 바와 같이 물론

는, 컴파일러 최적화는 여전히 예외를 던지고 호출자에 예외 처리를 단순화 할 수없는 인라인 함수를 발견 할 수있다.

+1

당신이 선언/사용 정의 소멸자가없는 한'암시 noexcept' 있음을 누락 * * 암시'noexcept' 목록에서? 사용자가 다른 예외 사양을 제공했습니다. 이것은 C++ 11의 C++ 03 동작과의 편차입니다. 즉, 사용자는 소멸자를'T :: ~ T() {throw 1; }'다른 예외가 활성화되지 않은 경우에도 프로그램을 종료합니다 (예외 사양이 없음을 참고하십시오). –

+0

표준을 검사 할 때 감사합니다. 감사합니다. – aschepler

+1

또한 원래 응답에서 빠졌습니다 : 명시 적으로 기본 설정된 특수 멤버는 암시 적으로 선언 된 것처럼 동일한 동작을합니다. – aschepler