C++ 默认构造函数可以抛出吗?

C++ 默认构造函数可以抛出吗?,c++,c++11,C++,C++11,默认的默认构造函数是由C++编译器生成的,用户无法控制它们。他们会扔吗?声明时指定noexcept可以吗 下面的代码可以通过gcc编译 struct A { A() = default; }; struct B { B() noexcept = default; }; int main() { A a; B b; return 0; } 默认构造函数可以抛出吗 是的,他们可以。例如,如果类具有其默认构造函数抛出的数据成员 struct Foo { Foo() {

默认的默认构造函数是由
C++
编译器生成的,用户无法控制它们。他们会扔吗?声明时指定
noexcept
可以吗

下面的代码可以通过
gcc
编译

struct A
{
  A() = default;
};

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

int main()
{
  A a;
  B b;

  return 0;
}
默认构造函数可以抛出吗

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

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

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

允许向默认的特殊成员函数(默认构造函数、复制构造函数、赋值运算符等)添加
noexcept
说明符


根据所涉及函数的
noexcept
说明符(其隐式noexcept说明符),声明的特殊成员函数将具有
noexcept
说明符。如果显式指定
noexcept
编译将失败,如果这与隐式
noexcept
说明符冲突。

我的意思是,程序员必须知道成员不会抛出,然后指定
noexcept
,编译器将不会自己找到这个问题。@user1095108我不明白你在问什么。为什么编译器会抛出它呢?标准中明确禁止它这样做的是什么。@用户1095108这就像问“标准中明确禁止编译器将
a=b+c;
首先将
a
设置为
b
c
之和,然后随机翻转一位?”构造函数不会抛出,除非标准中有说明他们可以抛出的内容。@hvd我同意,但您所做的声明仍然应该在标准中。因此编译器将自动提供
noexcept
说明符,如果适用的话?这个答案是有意义的,如果这是标准所说的,我也不会感到惊讶,但GCC不同意<代码>结构S{inti=(抛出0,0);S()=default;}仍然生成
S
的构造函数
noexcept
,并且无法捕获从NSDMI引发的异常。@hvd您向gcc的bugzilla报告了吗?@Marglisse不,我没有。我不相信这是GCC中的错误。该标准规定隐式定义的成员函数的
noexcept
规范仅取决于它们调用的函数。默认构造函数没有调用任何函数,因此标记构造函数
noexcept
似乎正是标准所要求的,尽管常识会给出相反的建议。@hvd如果它不是gcc中的错误,那么它就是标准中的错误,向gcc报告它不会有什么坏处,那么请…你是指默认的构造函数吗?还是默认的默认构造函数?默认构造函数通常不是由编译器生成的。@JonathanWakely感谢您的更正。