【发布时间】:2020-03-10 22:38:48
【问题描述】:
据我所知,默认情况下会复制抛出的对象。所以当我抛出一个对象时应该调用复制构造函数。我也知道编译器可能会优化和省略复制。我在这里有一个简单的程序,我在其中抛出了一个名为 X 的类。预计如果我使该类不可复制,则无法抛出该对象。但是意想不到的事情发生了。如果我删除复制构造函数,编译器会抱怨这一点。如果我注释复制构造函数的删除并删除移动构造函数,编译器会抱怨删除移动构造函数。 代码:
class X
{
public:
int code;
X(int code) : code(code) {}
//X(X&) = delete;
//X(X&&) = delete;
};
void func()
{
X x(4);
throw x;
}
int main() { }
删除复制构造函数时的错误:
main.cpp: In function ‘void func()’:
main.cpp:13:11: error: use of deleted function ‘X::X(X&)’
throw x;
^
删除移动构造函数时的错误:
main.cpp: In function ‘void func()’:
main.cpp:13:11: error: use of deleted function ‘X::X(X&&)’
throw x;
^
有人可以解释为什么会这样吗?
编辑:如果我删除复制构造函数并为移动构造函数提供实现,则代码可以正常工作。而如果我删除移动构造函数并为复制构造函数提供一个实现,我仍然会得到同样的错误。为什么我不能删除移动构造函数?
代码:
class X
{
public:
int code;
X(int code) : code(code) {}
X(X&) = default;
X(X&&) = delete;
};
void func()
{
X x(5);
throw x;
}
int main() { }
错误:
main.cpp: In function ‘void func()’:
main.cpp:13:11: error: use of deleted function ‘X::X(X&&)’
throw x;
^
【问题讨论】:
-
当你“删除复制构造函数”时,是否恢复移动构造函数(这样一些构造函数就剩下了)?
-
@StackExchange123 删除其中一个或两个构造函数之间几乎没有区别。当您删除其中任何一个时,它将删除另一个构造函数。当你删除两者时,它也没有任何区别。
-
@Yksisarvinen 仅当我为移动构造函数提供实现时才有效。如果我删除了移动构造函数,即使我提供了复制构造函数的实现,我仍然会得到同样的错误。
-
@aep 谢谢。我将编辑问题。
标签: c++ exception copy-constructor throw move-constructor