我正在学习利普曼的C++底漆第5版,我有一个问题。那本书写的是:
如果从其中获取成员的对象是lvalue,则点运算符将产生一个lvalue;否则,结果就是rvalue。
string x = "Hello World";
x.size() = 20; // I get an error saying that left-hand operand should be an l-
// value有人能解释原因吗?
发布于 2018-01-31 18:43:48
“如果从其中获取成员的对象是lvalue,则点运算符将产生一个lvalue;否则,结果是rvalue。”
当成员是对象而不是函数时,这是相关的。
假设你有:
struct Foo
{
int a;
};
Foo bar() { return Foo{}; }并将Foo和bar用作:
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不是lvalue,而是因为x.size()返回一个非lvalue的对象。
发布于 2018-01-31 18:32:31
“如果从其中获取成员的对象是lvalue,则点运算符将产生一个lvalue;否则,结果是rvalue。”
std::string::size()不是成员,而是方法,因此您的示例不遵循该语句。
注意:如果我们可以在这个意义上将方法称为成员,我们可以进行讨论。这是有疑问的,但是引文将适用于成员函数本身,而不是依赖于不同规则的调用的结果。也许我们可以讨论x.size是否为lvalue (这没有多大意义,因为您不能将指针分配给成员函数或独立函数),但这条规则肯定不适用于x.size()。
看起来,尽管为了清晰起见,这个语句被简化了,例如,“否则结果是一个rvalue”并不完全正确,因为它实际上是xvalue。
a.m,对象表达式的成员,其中a是rvalue,m是非引用类型的非静态数据成员;
详细信息可以在这里找到,价值范畴
发布于 2018-01-31 18:34:52
错误消息抱怨的是x.size()的结果,而不是x或x.size()本身。结果(std::string::size_type)不是l值,而是r值.
https://stackoverflow.com/questions/48549113
复制相似问题