2015-10-13 81 views
8

异常使用静态类型的对象copy-initialize被抛出的对象。例如:为什么必须抛出对象进行复制初始化?

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

int main() 
{ 
    throw foo(); 
} 

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

+0

我不能再删除它,因为它有答案,但我因为“简单的印刷错误”而投票结束,因为题外话题。我的问题并不像这个那么微不足道,但我显然忘了创建一个移动构造函数。 – zneak

+0

感谢你的问题,我学到了一些东西。请不要投票结束它,并且绝不会删除它! –

回答

9

由于该类型没有移动构造函数,因此无法移动构造。删除的副本构造函数禁止隐式移动构造函数。

4

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

+0

移动构造函数不会被删除,只是不存在。 –

+0

@JonathanWakely什么'没有删除,只是失踪'?删除拷贝构造函数暗含删除移动构造函数 – SergeyA

+0

@JonathanWakely:两个略有不同的“删除”意义。我认为最好明确一个人能做什么,不能做什么。如定义移动构造函数。 –

6

代码修改为以下内容:

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

int main() 
{ 
    throw foo(); 
} 

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

3

从标准的适用措辞(§[class.copy]/9)看起来大致是这样的(当然,正是这样,因为N4296的):

如果一个类X的定义并没有明确声明移动构造函数,一个将被隐式声明为默认,当且仅当:

  • X没有一个用户声明的拷贝构造函数,

[...]

这适用,因为将复制ctor定义为已删除仍然意味着您宣布了复制ctor。

相关问题