C++箭头运算符 (->) 是否在所有情况下都返回左值?

Does the C++ Arrow Operator (->) return an lvalue in all cases?

本文关键字:情况下 返回 是否 运算符 gt C++      更新时间:2023-10-16

根据C++入门书,"箭头运算符需要一个指针操作数并产生一个左值"。情况总是这样吗?例如:

#include<iostream>
#include<string>
using std::string; using std::vector;
int main()
{
vector<string> temp {"aaa", "bbb", "ccc"};
vector<string>::iterator iter_str = temp.begin();
bool result = iter_str->empty();  //the result of iter_str->empty() is not an lvalue right?
return 0;
}
  • 例如,当我们使用表达式 iter_str->empty(( 时,它不可能是赋值运算符的左操作数吧?
  • 如果箭头运算符返回一个左值,它是否不必始终返回?还是此规则有例外?

这本书的意思是,iter_str->产生一个左值,即你正在使用的对象的值类别是一个左值。iter_str->empty()的整个表达式仍然是右值,因为empty按值返回。 以这样的类为例

struct integer {
int x;
int& ref() & {
return x;
}
};

在这里,由于ref 限定符ref只能在 lvalue 对象上合法调用。 如果我们有一个像这样的函数

integer* get_integer_ptr() { return new integer; }

那么我们可以合法地做

int foo = get_integer_ptr()->ref();

即使指针是右值,它也访问左值对象,因此对ref的调用是合法的。


是的,存在内存泄漏,但出于示例的目的,我们可以忽略它。