【问题标题】:Difference between (void)obj and void(obj)(void)obj 和 void(obj) 之间的区别
【发布时间】:2014-09-09 11:29:47
【问题描述】:

根据http://en.cppreference.com/w/cpp/language/explicit_cast,C 风格转换和函数转换是等价的。但是,请参阅以下示例:

#include <array>
int main() {
  std::array<int, 3> arr{};
  (void)arr;
  //void(arr);
}

虽然 (void)arr 可以编译,但 void(arr) 不会。我错过了什么?

【问题讨论】:

  • 你得到什么错误信息?
  • void(arr) 肯定会被解析为函数调用。你认为投射到void 甚至意味着什么?因为它没有任何意义!
  • 强制转换为void是有效的,表示表达式的结果被丢弃。它通常用于使未使用的变量警告静音,并且在 TMP 中用于防止选择重载逗号运算符的重载解析。
  • 将表达式语句强制转换为 void 的有效替代语法包括:( void(arr) );static_cast&lt;void&gt;(arr);
  • @DavidHeffernan:不,它会被解析为变量声明,会报错,因为变量不能有void类型,并且已经有一个名为arr的变量。

标签: c++ casting void


【解决方案1】:

虽然void(arr) 通常与(void)arr 相同,但在此上下文中它是一个定义,并且您正在尝试创建一个名为arr 的变量void,这是不允许的。

【讨论】:

  • 如此简短,如此合理,如此实际地回答了这个问题。
【解决方案2】:

如果不涉及歧义(例如,其他同名函数、宏..),the following code 声明并定义两个int 变量

int a = 22;
int (b) = 33;

因此您正在尝试创建一个 void 变量类型(具有现有名称)

这是错误的,因为:

  1. You're trying to create a void variable

  2. 您正在尝试将现有名称用于同一范围内的另一个变量

【讨论】:

  • 我想从现在开始我会坚持使用(type)(var) 的语法来避免这种歧义。 C++ 风格的转换是明确的,但另一方面也太讨厌了。
猜你喜欢
  • 2014-05-06
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 2012-11-22
  • 1970-01-01
  • 2021-05-17
相关资源
最近更新 更多