我正在尝试使用 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
?
最佳答案
在 C++17 中 the compiler is guaranteed to elide the copy .但是在所有情况下,您仍然需要有一个有效的复制构造函数。
因此,如果您只关心性能,则无需执行任何操作。如果你想删除复制构造函数,因为该值在逻辑上不应该是可复制的,那么据我所知没有办法做到这一点。你必须返回 std::unique_ptr<T>
或者通过引用获取值并以这种方式进入它。编辑:或者定义一个移动构造函数。
关于c++ - 从函数返回局部值而不触发复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44750550/