C 复制构造函数在返回时称为
C++ copy constructor called at return
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;
}
virtual ~A() = default;
是用户声明为destructor。因此,A
不再具有移动构造函数。这意味着return tmp;
无法移动tmp
,并且由于tmp
无法复制,因此您会收到编译器错误。
有两种方法可以解决此问题。您可以添加一个移动构造函数,例如
struct A{
std::unique_ptr<B> x;
A() = default; // you have to add this since the move constructor was added
A(A&&) = default; // defaulted move
virtual ~A() = default;
};
或者您可以创建一个具有虚拟破坏者并从中继承的基类
struct C {
virtual ~C() = default;
};
struct A : C {
std::unique_ptr<B> x;
};
这起作用是因为A
不再具有用户声明为destructor(是的,C
可以,但我们只关心A
),因此它仍然会在A
中生成移动构造函数。重要的部分是C
没有删除的移动构造函数,它只是没有一个时期,因此尝试移动它会导致副本。这意味着 C
的复制构造函数在A
的隐含生成的移动构造器中被调用,因为C(std::move(A_obj_to_move_from))
只要没有删除的移动构造函数即可复制。
相关文章:
- 为什么当我尝试返回引用时,我的对象仍然被复制
- 如何返回/复制unique_ptr<无符号字符[]>的值?
- 像 std::list<std::p air<string, string>> 这样的结构在返回时会被复制吗?
- 使用 sftp_open() 使用 C++ 中的 SFTP libssh 将文件从本地复制到远程时,File 返回 N
- 如何将不可移动和不可复制的函数返回值获取到数组中
- 阻止在返回时复制共享指针
- 函数返回时,带指针的复制构造函数失败
- 复制构造函数 C++ 在析构函数上返回奇怪的字母
- 将参数的省略复制为返回值
- 为什么我的类工作正常,即使在返回垃圾值作为赋值运算符和空复制构造函数的返回之后
- 如何让"factory function"返回不可复制的对象?
- 为什么返回std::optional有时移动,有时复制
- 复制构造函数、按值传递和按值返回、链式操作、编译器
- 复制省略并在返回值中移动语义
- 以最佳方式返回复制的值
- 返回复制的对象
- 嵌入式mono:将数组从C#DLL返回/复制到C++
- C 返回复制对象
- 从具有移动语义或返回值优化的函数返回值,但不返回复制构造函数
- 如何strcpy和返回复制的字符数