从一个左值的对象调用成员是否返回左值?

Hov*_*yan 2 c++

我正在学习Lipman的C++入门第5版,我有一个问题.在那本书中写道:

如果从中获取成员的对象是左值,则点运算符产生左值; 否则结果是右值.

string x = "Hello World";
x.size() = 20; // I get an error saying that left-hand operand should be an l-
               //  value
Run Code Online (Sandbox Code Playgroud)

有谁能解释为什么?

R S*_*ahu 6

"如果从中获取成员的对象是左值,则点运算符产生左值;否则结果为右值."

当成员是对象而不是函数时,这是相关的.

假设你有:

struct Foo
{
   int a;
};

Foo bar() { return Foo{}; }
Run Code Online (Sandbox Code Playgroud)

并使用Foobar:

int main()
{
    Foo f1;  // f1 is an lvalue.
    f1.a = 10;   // Valid. f1 is an lvalue. Implies that f1.a is an lvalue.

    bar();   // The object returned is not an lvalue.
    bar().a = 20; // Not vaild since bar().a is not an lvalue.
}
Run Code Online (Sandbox Code Playgroud)

在你的情况下,

x.size() = 20;
Run Code Online (Sandbox Code Playgroud)

失败不是因为x不是左值,而是因为x.size()返回一个不是左值的对象.