首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从作为lvalue的对象调用成员是否返回lvalue?

从作为lvalue的对象调用成员是否返回lvalue?
EN

Stack Overflow用户
提问于 2018-01-31 18:29:23
回答 3查看 214关注 0票数 3

我正在学习利普曼的C++底漆第5版,我有一个问题。那本书写的是:

如果从其中获取成员的对象是lvalue,则点运算符将产生一个lvalue;否则,结果就是rvalue。

代码语言:javascript
复制
string x = "Hello World";
x.size() = 20; // I get an error saying that left-hand operand should be an l-
               //  value

有人能解释原因吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-31 18:43:48

“如果从其中获取成员的对象是lvalue,则点运算符将产生一个lvalue;否则,结果是rvalue。”

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

假设你有:

代码语言:javascript
复制
struct Foo
{
   int a;
};

Foo bar() { return Foo{}; }

并将Foobar用作:

代码语言:javascript
复制
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.
}

在你的情况下

代码语言:javascript
复制
x.size() = 20;

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

票数 6
EN

Stack Overflow用户

发布于 2018-01-31 18:32:31

“如果从其中获取成员的对象是lvalue,则点运算符将产生一个lvalue;否则,结果是rvalue。”

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

注意:如果我们可以在这个意义上将方法称为成员,我们可以进行讨论。这是有疑问的,但是引文将适用于成员函数本身,而不是依赖于不同规则的调用的结果。也许我们可以讨论x.size是否为lvalue (这没有多大意义,因为您不能将指针分配给成员函数或独立函数),但这条规则肯定不适用于x.size()

看起来,尽管为了清晰起见,这个语句被简化了,例如,“否则结果是一个rvalue”并不完全正确,因为它实际上是xvalue

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

详细信息可以在这里找到,价值范畴

票数 3
EN

Stack Overflow用户

发布于 2018-01-31 18:34:52

错误消息抱怨的是x.size()的结果,而不是xx.size()本身。结果(std::string::size_type)不是l值,而是r值.

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48549113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档