在下面的代码中,我设置了 p const 因为它在 Foo 的生命周期内永远不会指向任何其他 int。这不会编译,因为调用了 unique_ptr 的复制构造函数,这显然被删除了。除了使 p 非常量之外,还有其他解决方案吗?谢谢。
#include <memory>
using namespace std;
class Foo
{
public:
//x is a large struct in reality
Foo(const int* const x) : p(x) {};
Foo(Foo&& foo) : p(std::move(foo.p)) {};
private:
const unique_ptr<int> p;
};
原文由 Agrim Pathak 发布,翻译遵循 CC BY-SA 4.0 许可协议
您的移动构造函数的语义是矛盾的。
您已经声明了一个
const std::unique_ptr
它将(唯一地)拥有它初始化的值。 但是 您已经声明了一个移动构造函数,它应该在构造时将该值移动到另一个对象中。那么,您认为
std::unique_ptr
在构建的“临时”中应该发生什么?如果您希望它是
release()
ed,那么您就违反了它的const
。如果您希望它保留其值,则您违反了std::unique
的约束,该约束要求不超过一个此类对象拥有任何给定对象。 将死。这个问题揭示了 C++ 语言的一个微妙的限制。它需要
move
语义以将复制 的 对象保留为有效对象。有几个非常合理的“破坏性移动”建议实际上可以更好地反映
move
的大多数用途正在做的事情 - 从那里“使”那里的东西“无效”。谷歌他们。我没有做过文献调查,所以不想推荐一个。
您在这里的替代方法是删除
const
或强制转换。我强烈建议删除它。您可以确保类的语义确保适当的 const-ness 没有影响,也没有“丑陋的嫌疑人”const_cast
。