【问题标题】:C++ 11/14 Unique Pointer not so unique?C++ 11/14 唯一指针不是那么唯一吗?
【发布时间】:2017-10-02 17:30:55
【问题描述】:

我刚刚稳定了一个unique_pointer引用作为函数参数传递的情况。所以我看了一下,发现代码实际上是在编译和运行。

为什么会这样? 当您可以引用该指针时,该指针如何唯一?

这是我的例子:

class Foo{
    public:
    int bar{23};
};

void Bar(std::unique_ptr<Foo>& a_foo){
    a_foo->bar = 42;
}

int main(int argc, char *argv[]){

    auto foo{ std::make_unique<Foo>() };
    Bar(foo);
    std::cout << foo->bar << std::endl; //outputs 42

    return 0;
}

【问题讨论】:

  • “唯一”是指“唯一所有权”。
  • 做。你知道get方法吗?

标签: c++ c++11 c++14 unique-ptr


【解决方案1】:

当您可以引用该指针时,该指针如何唯一?

你可以有任意多个对该指针的引用,但实际上仍然只有一个。

删除&amp;,以便您尝试复制unique_ptr,您的程序将无法构建。您不允许克隆/复制指针,以便有多个指向同一事物。这就是“独特”的含义。

【讨论】:

    【解决方案2】:

    引用不会创建指针的新实例。仅仅因为您可以引用指针并不意味着它不是唯一的。我可以通过名字来引用你,这并不意味着我每次使用你的名字时都克隆了你 :) C++ 中的引用 - 在这方面 - 就像一个人的名字。

    【讨论】:

    • 一个很好的类比!
    • 感谢您的回复,但我想回答并且可能没有正确表达的是:这不是唯一指针背后的想法是唯一的吗?如果你可以在其他地方引用它有什么意义,你仍然可以改变它,为什么不使用共享?
    • @C.Michael 当您使用引用时,您需要确保引用不会成为悬空引用。换句话说,编译器不能阻止你错误地设计你的软件。如果你需要一个共享指针,使用它不是因为你希望编译器强迫你这样做,而是因为它是正确的做法。
    • 库巴奥伯。库巴奥伯。库巴奥伯。现在,你的人数超过了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多