默认的构造函数由C++
编译器生成,用户无法控制它们。他们可以扔?声明一个时指定noexcept
可以吗?可以默认构造函数抛出吗?
以下代码可与gcc
编译通过。
struct A
{
A() = default;
};
struct B
{
B() noexcept = default;
};
int main()
{
A a;
B b;
return 0;
}
默认的构造函数由C++
编译器生成,用户无法控制它们。他们可以扔?声明一个时指定noexcept
可以吗?可以默认构造函数抛出吗?
以下代码可与gcc
编译通过。
struct A
{
A() = default;
};
struct B
{
B() noexcept = default;
};
int main()
{
A a;
B b;
return 0;
}
它允许一个noexcept
符添加到默认的特殊成员函数(默认构造函数,拷贝构造函数,赋值运算符等)。
A default
声明的特殊成员函数将具有noexcept
说明符,具体取决于涉及函数(其隐式noexcept说明符)的noexcept
说明符。如果您明确指定noexcept
编译将失败,如果这与隐含的noexcept
说明符冲突。
那么编译器会自动提供'noexcept'说明符(如果适用)? – user1095108
这个答案是有道理的,如果是标准说的话,我不会感到惊讶,但GCC不同意。 'struct S {int i =(throw 0,0); S()= default; };'仍然使'S'的构造函数为'noexcept',并且从NSDMI抛出的异常不能被捕获。 – hvd
@ hvd您是否向gcc的bugzilla报告过? –
可以使用默认构造函数throw?
是的,他们可以。例如,如果该类具有其默认构造函数抛出的数据成员。
struct Foo
{
Foo() { /* throws */}
};
struct Bar
{
Bar() = default;
Foo f;
}
我的意思是,程序员必须知道成员不会抛出然后指定'noexcept',编译器不会自己找到它。 – user1095108
@ user1095108我不明白你在问什么。为什么一个编译器会为此付出代价? – juanchopanza
标准中特别禁止它这样做。 – user1095108
你的意思是默认的构造函数吗?或默认的构造函数?一般情况下,编译器不会生成默认的构造函数。 –
@JonathanWakely感谢您的纠正。 – user1095108