我正在阅读“C ++ Primer(第5版)”并且我遇到了一些我不确定我理解正确的事情。
这个例子与他们在书中给出的例子非常相似。想象一下,我们有一些返回字符串的函数(或任何具有非静态成员的类):
string some_function(par1, par2) {
string str;
// some code
return str;
}
我知道您可以使用任何函数的返回值来访问其成员,即这样的内容是有效的:
auto size = some_function(arg1, arg2).size(); // or whatever member of class
但是,由于点运算符.
和函数调用运算符()
具有从左到右的分组和相同的优先级,因此上面的表达式应该是这样的:
(some_function(arg1, arg2)).size()
我想我到目前为止是对的?这里我不明白的是评价顺序。由于未为.
运算符指定评估顺序,因此表示将首先评估some_function(arg1, arg2)
或size()
。但是,如果它不知道它在哪个对象上工作,它怎么能首先评估size()
?这意味着评估顺序应该从左到右固定,但事实并非如此。这怎么可能?
另一个例子是这样的:
cin.get().get();
同样,似乎应该在第二个cin.get()
之前评估第一个get()
,因为它不知道它在哪个对象上工作,但似乎并非如此。< / p>
答案 0 :(得分:0)
具有相同优先级的运算符根据它们的关联性进行评估,对于包含函数调用和元素选择运算符的运算符组,您正确地观察到它是从左到右。因此,是的,给出表达式
x = foo().bar();
操作顺序是
x = (((foo()).bar)());
考虑所涉及的所有运营商的相对优先级和相关性。但是,没有人以这种方式编写代码。
同样,给定
cin.get().get()
操作顺序是
(((cin.get)()).get)()
,是的,优先规则导致首先计算cin.get()
子表达式,从而产生第二个.
(以及表达式的其余部分)应用到的对象。 / p>