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
相关产品推荐
相关产品推荐

