我理解下面指出的错误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&'
}
答案 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()
将为您提供指针。尝试这不是一件好事!