【问题标题】:How understand ++ cast expression in cpp?如何理解cpp中的++ cast表达式?
【发布时间】:2020-04-25 02:40:31
【问题描述】:

我对语法++ cast-expression的理解如下:

float p = 3.14;
++(int)p;

但是当我用clang编译它时,它编译失败。那么如何理解++ cast-expression以及有什么用呢? (int)p 是一个 cast-expression 那么为什么它不起作用呢?

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf

【问题讨论】:

  • 没有名为flaot 的类型,第二行缺少;。你得到的错误是什么(在修正了这些错别字之后)?
  • (int)p 不是左值。
  • 没有“++ cast”之类的东西,你有的是C-style cast和一个预增量操作,这不是一个操作。
  • @CoryKramer 我认为 OP 不会调用 ++ 演员。语法说++ 可以跟随一个演员表,OP 询问它什么时候可以发生。
  • 编辑希望让这一点更清楚。

标签: c++


【解决方案1】:

++(int)p 无法编译,因为(int)p 不是左值。然而,这是一个语义错误,而不是句法错误。从语法上讲,它是有效的,并且与 ++ cast-expression 生产相匹配。

++ 后跟转换在语法和语义上都有效的实例是当您转换为引用时(引用是左值)。一个例子(虽然不是一个有用的例子)是:

int x = 42;
++(int&)x;

实际上,++ cast-expression 中的 cast-expression 很少是实际演员表。在大多数情况下,cast-expression 会进一步缩减为 primary-expression,让您可以匹配 ++x 这样的表达式。

【讨论】:

  • 更合理的例子:void dangerous(const int & x) { ++(int &)x; }
  • 避免 C 风格转换的另一个理由。 static_cast 会触发错误。
猜你喜欢
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
相关资源
最近更新 更多