我正在学习Lipman的C ++入门第5版,我有一个问题。在那本书中写道:
如果从中获取成员的对象是左值,则点运算符产生左值;否则结果是右值。
string x = "Hello World";
x.size() = 20; // I get an error saying that left-hand operand should be an l-
// value
任何人都可以解释原因吗?
答案 0 :(得分:6)
“如果从中获取成员的对象是左值,则点运算符产生左值;否则结果为右值。”
当成员是对象而不是函数时,这是相关的。
假设你有:
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
不是左值,而是因为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值。