返回常量引用(没有对常量的引用)时出现问题



我想返回一个常量引用,这样我就不能更改对象本身,但我可以调用它们的非常量方法。但我不知道怎么做。

指针很容易,我可以在常量指针(constmyclass*(或指向常量值的指针(myclassconst*(之间进行选择。但是对于引用,它的工作方式似乎不一样,我所得到的只是对const对象的引用,所以我不能调用非常量方法。

我确信我做错了什么。

class A {
int a;
public:
auto get() const { return a; }
auto set(int i) -> void { a = i; }
};
class B {
A a_;
public:
auto get() const -> const A& { return a_; }
};

我可以做:

B b;
cout << b.get().get();

但不是:

B b;
b.get().set(100); // compiler error

我不想要

class B {
A a_;
public:
auto get() -> A& { return a_; }
};
B b;
A a;
b.get() = a; // I don't want this!

你不能有"部分可变性";以这种方式,并非不从A中完全移除指派
(尽管您声称这对指针来说很容易,但情况完全相同——您需要禁止b.get()->set(100)或允许*b.get() = a。(

您可以做的一件事是通过代理对象添加一个间接级别:

class A_Setter
{
public:
A_Setter(A* a): the_a(a) {}
A_Setter& operator=(const A_Setter&) = delete;
void set(int x) { the_a->set(x); }
private:
A* the_a;
};
class B {
A a_;
public:
A_setter get() { return A_setter(&a_); }
};

现在b.get().set(100);将编译,而不是b.get() = a;

返回常量引用(没有对常量的引用(的问题

从技术上讲,没有const引用这样的东西。推荐人没有顶级简历限定符。Const引用通俗地说表示对Const的引用。

我想返回一个。。。引用,所以我不能更改对象本身

对象不能通过对const的引用进行修改,因此这是可行的。

。。。但我想调用它们的非常量方法。

只能通过引用非常数来调用非常数成员函数。没有一类推荐信可以同时满足你的两种需求。它们是矛盾的。

使用指针很容易,我可以在常量指针(const myclass*(或指向常量值的指针(myclass const*(之间进行选择。

这些也不能达到你想要的。可以通过const指针(指向非常数(修改指向对象,也不能通过指向const的(非常数(指针调用指向对象的const成员函数。两者都没有达到你的两个愿望。


p。S.返回const(或volatile(限定指针或任何其他内置类型是没有意义的,因为对此类函数的函数调用是prvalue表达式,而非类类型的prvalue没有cv限定符,因此此类返回类型的限定符将始终被忽略。不要将此与返回指向cv限定类型的指针混淆,这是有意义的。

最新更新