问题 为什么用括号括起来的令牌不是r值表达式?


请考虑以下代码:

#include <iostream>

struct Foo
{
  Foo() : bar( 0 ) {}

  int bar;
};


int main()
{
  Foo foo;

  ++(foo.bar);

  std::cout<< foo.bar << std::endl;

  system("pause");
  return 0;
};

为什么 foo.bar 评价为1?

不是括号中的 (foo.bar) 创建一个未命名的(r值)表达式,然后递增?


12235
2017-10-31 08:36


起源

不,你是否混淆了其他语言 f(x) 和 f((x)) 是不同的? - Bo Persson
@BoPersson但是有一些背景可以带来改变。例如 decltype(x) 和 decltype((x)) 可以是不同的。 - juanchopanza
@juanchopanza:该死......这太棘手了! - Matthieu M.


答案:


因为标准明确规定在3.4.2第6段:

带括号的表达式是一个主要表达式,其类型和   值与所附表达式的值相同。 存在   括号不影响表达式是否为左值。

强调我的。


9
2017-10-31 08:42



我很困惑,因为: struct Widget{} w;  - > decltype(w) 和 decltype((w)) 不一样。也可以看看 链接,幻灯片33。 - Martin85
@ user1787909: decltype 很特别。 - CB Bailey


不,除了改变操作顺序之外,括号没有任何意义。

要创建右值,您需要使用特殊功能 std::move(x)


1
2017-10-31 08:43



这个不对。他们可能会阻止adl发生。 - Johannes Schaub - litb
@Johannes,Adl是什么? - Kirill Kobelev
您可能想要在其上创建一个新的stackoverflow问题。 - Johannes Schaub - litb
这里是否难以缩写? - Kirill Kobelev
adl =参数依赖名称查找 - Martin85