异常使用对象的静态类型来复制 - 初始化抛出的对象。例如:
struct foo
{
foo() = default;
foo(const foo&) = delete;
};
int main()
{
throw foo();
}
Clang++ --std=c++14
抱怨无法使用显式删除的复制构造函数。为什么不能进行移动初始化呢?
答案 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。