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

时间:2018-01-31 18:29:23

标签: 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

任何人都可以解释原因吗?

3 个答案:

答案 0 :(得分:6)

  

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

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

假设你有:

struct Foo
{
   int a;
};

Foo bar() { return Foo{}; }

并使用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.
}

在你的情况下,

x.size() = 20;

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

答案 1 :(得分:3)

  

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

std::string::size()不是成员,而是方法,因此您的示例不遵循该声明。

注意:如果我们可以在这个意义上将方法称为成员,我们可以进行讨论。这是有问题的,但引用则适用于成员函数本身,而不是依赖于不同规则的调用的结果。也许我们可以讨论x.size是否是左值(由于你不能指向成员函数或独立的指针,这没有多大意义),但这条规则肯定不适用于x.size() < / p>

虽然这个陈述是为了清晰起见而简化,例如&#34;否则结果是一个右值&#34;不太正确,因为它实际上是xvalue

  

a.m,对象表达式的成员,其中a是rvalue,m是非引用类型的非静态数据成员;

详情请见value category

答案 2 :(得分:3)

错误消息会抱怨private void TextBox_KeyUp(object sender, Windows.UI.Xaml.Input.KeyRoutedEventArgs e) { if (IsValid(e.Key)) { MyLogic(); } } private void TextBox_KeyDown(object sender, Windows.UI.Xaml.Input.KeyRoutedEventArgs e) { if (IsValid(e.Key)) { MyLogic(); } } private bool IsValid(VirtualKey key) { return key != VirtualKey.Tab; } void MyLogic() { // TODO } 结果,而不是x.size()x本身。结果(x.size())不是l值而是r值。