【问题标题】:Why are tokens wrapped by parentheses not r-value expressions?为什么用括号包裹的标记不是右值表达式?
【发布时间】:2012-10-31 08:36:41
【问题描述】:

考虑以下代码:

#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 值)表达式,然后递增吗?

【问题讨论】:

  • 不,你是不是把它和f(x)f((x)) 不同的其他语言混淆了?
  • @BoPersson 但是在某些情况下它会有所不同。例如decltype(x)decltype((x)) 可以不同。
  • @juanchopanza:该死的......这很棘手!

标签: c++ parentheses rvalue


【解决方案1】:

因为标准在 3.4.2 第 6 段中明确指出:

带括号的表达式是一个主表达式,其类型和 值与封闭表达式的值相同。 存在感 括号的数量不影响表达式是否为左值。

强调我的。

【讨论】:

  • 我很困惑,因为:struct Widget{} w; -> decltype(w)decltype((w)) 不一样。另见link,幻灯片 33。
  • @user1787909: decltype 很特别。
【解决方案2】:

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

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

【讨论】:

  • 你可能想创建一个新的 stackoverflow 问题。
  • 这里不缩写有这么难吗?
  • adl = 参数依赖名称查找
  • 为了改进 stackoverflow 数据库,我已经不再回答评论问题了。
猜你喜欢
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
相关资源
最近更新 更多