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

const&与&成员函数限定符的区别及临时对象调用疑问

为什么const&限定的成员函数可以被临时对象调用?

这是C++标准中成员函数引用限定符和const左值引用绑定规则共同作用的结果,咱们一步步拆解来理解:

1. 成员函数引用限定符的基础规则

C++11引入的&和&&引用限定符,核心作用是限制成员函数能被什么样的对象调用:

  • 带&限定的成员函数只能被左值对象调用(比如有名字的变量、解引用得到的对象这类能取地址的实体);
  • 带&&限定的成员函数只能被右值对象调用(比如临时对象、std::move后的对象这类无法长期存在的实体)。

但这里有个关键特例:当成员函数同时带有const限定符和const&引用限定符时,调用规则会和普通&限定的函数不一样。

2. const左值引用的特殊绑定特性

C++标准明确规定:const左值引用(const T&)可以绑定到右值。这个设计的目的是让我们能安全地用const引用接收临时对象——既保证不会修改临时对象的内容,还能延长临时对象的生命周期。

回到你的代码场景:

  • getVarCLRef()是const&限定的成员函数,这意味着调用它时,对象会被当作const SomeClass&类型处理。临时对象SomeClass()是右值,但它完全可以被绑定到const SomeClass&上,所以这个调用是合法的;
  • 而getVarLRef()是普通&限定的函数,它要求调用对象必须是左值,但临时对象是右值,无法绑定到普通左值引用,因此编译器直接报错,这和你预期的一致。

3. 结合代码的直观验证

咱们看你的代码片段:

auto var1 = SomeClass().getVarCLRef(); // 合法:临时对象绑定到const&
auto var2 = SomeClass().getVarLRef();  // 非法:临时对象是右值,无法绑定到&

gcc 7.3.0严格遵循C++11标准,所以会拒绝第二个调用、允许第一个调用,完全符合规则。

简单总结:const&限定的成员函数能被临时对象调用,本质是因为const左值引用可以接受右值,而普通&限定的成员函数只能接受左值,两者的绑定规则差异导致了这个结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:50:50