我试图使用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
?
答案 0 :(得分:2)
在C ++ 17 the compiler is guaranteed to elide the copy中。但是,在所有情况下,您仍然需要具有有效的副本构造函数。
因此,如果您仅关注性能,则无需执行任何操作。如果由于逻辑上该值不可复制而要删除复制构造函数,那么据我所知没有办法。您必须返回一个std::unique_ptr<T>
或通过引用获取值并以这种方式进入它。编辑:或定义一个移动构造函数。
答案 1 :(得分:0)
复制elision,但它似乎是编译器优化,所以我认为它不适用。
确实如此。阅读Move or Named Return Value Optimization (NRVO)?
中的更多内容如何在不触发复制构建的情况下返回
d
?
让编译器处理它。