从函数返回本地值而不触发复制构造函数

时间:2017-06-25 20:56:48

标签: c++ class oop copy-constructor copy-elision

我试图使用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

2 个答案:

答案 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

让编译器处理它。