为什么抛出的对象必须进行复制初始化?

时间:2015-10-13 20:14:17

标签: c++ exception c++14

异常使用对象的静态类型来复制 - 初始化抛出的对象。例如:

struct foo
{
    foo() = default;
    foo(const foo&) = delete;
};

int main()
{
    throw foo();
}

Clang++ --std=c++14抱怨无法使用显式删除的复制构造函数。为什么不能进行移动初始化呢?

4 个答案:

答案 0 :(得分:9)

它无法移动构造,因为该类型没有移动构造函数。删除的拷贝构造函数会抑制隐式移动构造函数。

答案 1 :(得分:6)

将代码修改为以下内容:

struct foo
{
    foo() = default;
    foo(const foo&) = delete;
    foo(foo&&) = default;
};

int main()
{
    throw foo();
}

阅读this,“隐式声明的移动构造函数”部分。

答案 2 :(得分:4)

因为缺少foo(foo&& );。通过delete复制构造函数,你也可以移动构造函数。

答案 3 :(得分:3)

来自标准(§[class.copy] / 9)的适用短语看起来大致如此(好吧,就像N4296一样):

  

如果类X的定义没有显式声明一个移动构造函数,那么只有在以下情况下才会将其隐式声明为默认值:

     
      
  • X没有用户声明的副本ctor,
  •   

[...]

这是适用的,因为将副本ctor定义为已删除仍然意味着您已声明了副本ctor。