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

zne*_*eak 8 c++ exception c++14

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

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

int main()
{
    throw foo();
}
Run Code Online (Sandbox Code Playgroud)

Clang++ --std=c++14抱怨明确删除的拷贝构造函数不能使用.为什么不能进行移动初始化呢?

Jon*_*ely 9

它不能移动构造,因为类型没有移动构造函数.删除的复制构造函数会抑制隐式移动构造函数.


And*_*nov 6

将代码修改为以下内容:

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

int main()
{
    throw foo();
}
Run Code Online (Sandbox Code Playgroud)

阅读本文,"隐式声明的移动构造函数"一节.