【发布时间】:2019-08-12 19:06:59
【问题描述】:
error: use of deleted function 'A::A(const A&)'
return tmp;
^~~
为什么只有A中有虚析构函数时才调用复制构造函数?如何避免这种情况?
struct B {};
struct A{
std::unique_ptr<B> x;
virtual ~A() = default;
};
A f() {
A tmp;
return tmp;
}
【问题讨论】:
-
C++ 处理与 C#/Java 不同的对象。当实例超出范围时(此处为
tmp),必须调用其析构函数。因此,当您return tmp时,您要求它制作tmp的副本以返回给调用该函数的任何人。复制后,tmp将被销毁,其副本将可供使用。 -
@Everyone 除了它通常是移动而不是复制,这就是问题所在。
-
有点意外,因为我原以为会调用 RVO,导致没有移动或复制。
标签: c++