2014-02-09 2 views
6

기본값으로 설정된 기본 생성자는 C++ 컴파일러에 의해 생성되며 사용자는이 기본 사용자를 제어 할 수 없습니다. 그들이 던질 수 있습니까? 하나를 선언 할 때 noexcept을 지정해도 괜찮습니까?기본 구성 기본 생성자를 던질 수 있습니까?

다음 코드는 gcc으로 정상적으로 컴파일됩니다.

struct A 
{ 
    A() = default; 
}; 

struct B 
{ 
    B() noexcept = default; 
}; 

int main() 
{ 
    A a; 
    B b; 

    return 0; 
} 
+0

기본 생성자를 의미합니까? 아니면 디폴트의 기본 생성자인가? 기본 생성자가 일반적으로 컴파일러에 의해 생성된다는 것은 사실이 아닙니다. –

+0

@JonathanWakely 수정 해 주셔서 감사합니다. – user1095108

답변

7

(기본 생성자 복사 생성자, 대입 연산자 등)는 채무 불이행 특별 회원 함수에 noexcept 지정자를 추가 할 수 있습니다.

default 선언 된 특수 멤버 함수는 noexcept 지정 함수 자 (암시 적 noexcept 지정자)에 따라 noexcept 지정자를 갖습니다. noexcept을 명시 적으로 지정하면 내재적 인 noexcept 지정자와 충돌하면 컴파일이 실패합니다.

+0

컴파일러는 적용 가능한 경우 자동으로 'noexcept'지정자를 제공합니까? – user1095108

+1

이 답변은 의미가있을 것입니다. 표준이 말하는 것이면 놀랄 일이 아니지만 GCC는 동의하지 않습니다. 'struct S {int i = (throw 0, 0); S() = 기본값; };'여전히'S'의 생성자를'noexcept'로 만들고, NSDMI에서 던져진 예외는 잡히지 않습니다. – hvd

+0

@hvd gcc의 bugzilla에 신고 했습니까? –

5

기본 생성자가 throw 할 수 있습니까?

예, 가능합니다. 예를 들어, 클래스에 기본 생성자가 throw하는 데이터 멤버가있는 경우

struct Foo 
{ 
    Foo() { /* throws */} 
}; 

struct Bar 
{ 
    Bar() = default; 
    Foo f; 
} 
+0

내 말은, 프로그래머는 멤버가 throw하지 않고 'noexcept'를 지정하지 않는다는 것을 알아야한다는 것입니다. 컴파일러는 자체적으로 이것을 발견하지 못합니다. – user1095108

+0

@ user1095108 나는 당신이 무엇을 요구하고 있는지 이해하지 못합니다. 컴파일러가 왜 그것을 던져 버릴까요? – juanchopanza

+0

구체적으로 표준에서 그렇게하는 것을 금지합니다. – user1095108

관련 문제