2014-02-09 46 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符添加到默认的特殊成员函数(默认构造函数,拷贝构造函数,赋值运算符等)。

A default声明的特殊成员函数将具有noexcept说明符,具体取决于涉及函数(其隐式noexcept说明符)的noexcept说明符。如果您明确指定noexcept编译将失败,如果这与隐含的noexcept说明符冲突。

+0

那么编译器会自动提供'noexcept'说明符(如果适用)? – user1095108

+1

这个答案是有道理的,如果是标准说的话,我不会感到惊讶,但GCC不同意。 'struct S {int i =(throw 0,0); S()= default; };'仍然使'S'的构造函数为'noexcept',并且从NSDMI抛出的异常不能被捕获。 – hvd

+0

@ hvd您是否向gcc的bugzilla报告过? –

5

可以使用默认构造函数throw?

是的,他们可以。例如,如果该类具有其默认构造函数抛出的数据成员。

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

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

我的意思是,程序员必须知道成员不会抛出然后指定'noexcept',编译器不会自己找到它。 – user1095108

+0

@ user1095108我不明白你在问什么。为什么一个编译器会为此付出代价? – juanchopanza

+0

标准中特别禁止它这样做。 – user1095108

相关问题