为什么C2662错误不适用于对std :: unique_ptr <b>对象的const引用?</b>

时间:2012-08-01 01:25:10

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

我理解下面指出的错误C2662的原因。我的问题是为什么要打电话 a.GetB()->Get()中的main()不会产生类似的错误,因为GetB()也会返回对const对象的unique_ptr<B>引用?

#include <iostream>
#include <memory>

using namespace std;

class B
{
    int i;

    public:
    B(int j) : i(j) {}
    int Get() { return i; }
};

class A
{
    std::unique_ptr<B> uptrB;

    public:
    A(int i) : uptrB(new B(i)) {}
    const std::unique_ptr<B>& GetB() { return uptrB; }
    const B* GetB1() { return uptrB.get(); }
};

int main()
{
    A a(3);
    cout << a.GetB()->Get() << endl;
    cout << a.GetB1()->Get() << endl;  // error C2662:'B::Get' cannot conver 'this' pointer from 'const B' to 'B&'
}

2 个答案:

答案 0 :(得分:4)

const std::unique_ptr<B>类似于B* const,即一个指向可变B的不可变指针 - 而不是const B*,一个指向不可变B的可变指针。如果您想从unique_ptr版本中获得相同的错误,则需要编写std::unique_ptr<const B>。实际上,您将unique_ptr引用const引用,但它引用的B不是const

答案 1 :(得分:0)

您正在从getB()方法返回const引用。您无法更改const引用指向的地址。然而,在返回的对象上调用get()将为您提供指针。尝试这不是一件好事!