【发布时间】:2017-11-28 18:03:33
【问题描述】:
我正在尝试使用 c++ 类型系统删除复制构造函数以防止复制对象。
struct DeleteCopyConstructor {
DeleteCopyConstructor() {};
DeleteCopyConstructor(DeleteCopyConstructor& op2) = delete;
DeleteCopyConstructor(const DeleteCopyConstructor& op2) = delete;
};
DeleteCopyConstructor f() {
DeleteCopyConstructor d;
// initialize d...
return d;
}
错误是:
error: use of deleted function ‘DeleteCopyConstructor::DeleteCopyConstructor(const DeleteCopyConstructor&)’
我读过关于复制省略的内容,但它似乎是一种编译器优化,所以我认为它不适用。如何在不触发复制构造的情况下返回d?
【问题讨论】:
-
复制省略(称为返回值优化或 NRVO)将适用于这种情况。很可能你的编译器实现了它。
-
要把它从桌面上移开吗?
-
顺便说一句,您不需要
delete两个复制构造函数。 -
是否删除了复制构造函数以防止危险/不合逻辑的复制?
-
在 freenode IRC 上询问。如果我提供移动构造函数,代码就会编译。
DeleteCopyConstructor(DeleteCopyConstructor&& op2) = default;
标签: c++ class oop copy-constructor copy-elision