【发布时间】: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<void>(arr);。 -
@DavidHeffernan:不,它会被解析为变量声明,会报错,因为变量不能有
void类型,并且已经有一个名为arr的变量。