You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

何时需要使用引用限定的成员函数?

引用限定成员函数的理解验证

你的理解完全正确,以下是对应验证和补充:

1. 引用限定的核心作用

引用限定的本质就是区分调用成员函数的对象是左值还是右值:

  • 未添加引用限定的成员函数,会被左值对象、临时右值对象共用;
  • 加&限定的成员函数仅能被左值对象调用,加&&限定的仅能被右值对象调用。

你举的第一个例子完全符合这个逻辑:

class Obj {
public:
  Obj(int x) : x_{x} {}
  int& getVal() {return x_;}
};

无论Obj o{2}; o.getVal();(左值对象调用)还是Obj{2}.getVal();(临时右值对象调用),都会调用同一个getVal()函数。

2. 适用场景的判断准确

你猜测的“右值作为临时变量不应返回成员引用”是引用限定最常见的适用场景:
临时右值对象的生命周期通常仅到当前表达式结束,如果返回其成员的引用,后续使用该引用会触发悬空引用(访问已销毁对象的内存),属于未定义行为。

你给出的优化实现完全合理:

class Obj {
public:
  Obj(int x) : x_{x} {}
  int& getVal() & {return x_;} // 左值对象调用:返回成员引用(安全,左值生命周期可控)
  int getVal() && {return x_;} // 右值对象调用:返回成员副本(避免悬空引用)
};

3. 右值版本的扩展理解正确

你提到的“若要处理右值引用并修改成员变量,需对应右值版本”也是正确的。我们可以通过引用限定实现:

  • 允许右值对象调用修改函数并做移动优化;
  • 直接禁止右值对象调用修改函数(避免无意义的临时对象修改)。

示例代码:

class Obj {
public:
  Obj(int x) : x_{x} {}
  void setVal(int x) & { x_ = x; } // 仅左值对象可修改成员
  void setVal(int x) && = delete; // 禁止右值对象调用修改函数
};

内容的提问来源于stack exchange,提问作者John James

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:47:07