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

jca*_*er2 7 c++ oop class 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;
}
Run Code Online (Sandbox Code Playgroud)

错误是:

error: use of deleted function ‘DeleteCopyConstructor::DeleteCopyConstructor(const DeleteCopyConstructor&)’
Run Code Online (Sandbox Code Playgroud)

我读过有关复制省略,但它似乎是一个编译器优化,所以我认为它不适用.如何在d不触发复制构造的情况下返回?

gsa*_*ras -1

复制省略,但它似乎是编译器优化,所以我认为它不适用。

确实如此。阅读移动或命名返回值优化 (NRVO) 的更多内容?

如何才能返回d而不触发复制构造?

让编译器来处理它。

  • 好吧,我想做的是依靠类型系统来确保代码正确。我希望复制对象是类型错误。因为复制省略是一种优化,并且尽管语言语义表明变量应该被复制,但它仍然有效,因此在这种情况下它不适合我的需求。我所做的就是通过 ref 传递“out”参数,通过 const ref 传递“in”参数 - 这并不完美,但工作正常,并且消除了从函数返回值的任何需要,而无需语义复制它。 (3认同)
  • @gsamaras,因为它没有回答问题。我想依靠这里的类型系统 (3认同)