为什么必须抛出对象进行复制初始化?
异常使用静态类型的对象copy-initialize被抛出的对象。例如:为什么必须抛出对象进行复制初始化?
struct foo
{
foo() = default;
foo(const foo&) = delete;
};
int main()
{
throw foo();
}
Clang++ --std=c++14
抱怨显式删除的拷贝构造函数不能使用。为什么不能移动初始化呢?
由于该类型没有移动构造函数,因此无法移动构造。删除的副本构造函数禁止隐式移动构造函数。
因为缺少foo(foo&&);
。通过delete
复制构造函数你也抑制了移动构造函数。
移动构造函数不会被删除,只是不存在。 –
@JonathanWakely什么'没有删除,只是失踪'?删除拷贝构造函数暗含删除移动构造函数 – SergeyA
@JonathanWakely:两个略有不同的“删除”意义。我认为最好明确一个人能做什么,不能做什么。如定义移动构造函数。 –
代码修改为以下内容:
struct foo
{
foo() = default;
foo(const foo&) = delete;
foo(foo&&) = default;
};
int main()
{
throw foo();
}
阅读this,部分 “隐式声明的移动构造函数”。
从标准的适用措辞(§[class.copy]/9)看起来大致是这样的(当然,正是这样,因为N4296的):
如果一个类X的定义并没有明确声明移动构造函数,一个将被隐式声明为默认,当且仅当:
- X没有一个用户声明的拷贝构造函数,
[...]
这适用,因为将复制ctor定义为已删除仍然意味着您宣布了复制ctor。
我不能再删除它,因为它有答案,但我因为“简单的印刷错误”而投票结束,因为题外话题。我的问题并不像这个那么微不足道,但我显然忘了创建一个移动构造函数。 – zneak
感谢你的问题,我学到了一些东西。请不要投票结束它,并且绝不会删除它! –