【发布时间】:2021-06-23 16:15:25
【问题描述】:
所以我对移动语义和现代 C++ 很陌生,但据我了解,我可以编写类似的代码
Foo doSomething(Bar b) {
Foo f{b};
return f;
}
请注意,我没有明确编写 std::move 以允许编译器应用 RVO。
我不想修改 Foo 或 Bar 并且编译器失败并显示 Call to implicitly-deleted copy constructor of 'Foo'。
所以我试图通过引入一个动作来解决这个问题:
Foo doSomething(Bar b) {
Foo f{b};
return std::move(f);
}
失败并出现同样的错误。 (额外的问题:当我想移动 Foo 时,为什么编译器会抱怨复制构造函数?)
所以我的想法是将 Foo 包装在 std::unique_ptr 中,我的问题是这是否是修复它的“正确”方法。
std::unique_ptr<Foo> doSomething(Bar b) {
auto f = std::make_unique<Foo>(b);
return f;
}
【问题讨论】:
-
*NRVO。此外,
Foo显然没有 cctor 和 mctor。这样的对象可以通过 RVO 的奇迹返回(或者更准确地说 --prvalue在 C++17 中强制执行的魔法) -
您正在询问返回
Foo的适当方式。这取决于Foo是什么。这是您创建的课程吗?我们只能从您的错误中推断出它是一种隐式删除其复制构造函数的类型。 -
是的,您可以通过添加(并支付)间接级别来解决很多问题。
-
@DrewDormann 公平点 - 实际上我对 Foo 也不太了解,除了你提到的一点
标签: c++