为什么这个C++表达式甚至不会生成警告?
Why doesn't this C++ expression generate even a warning?
我知道你可以取消"expression without effect"警告,将表达式强制转换为void:
int main()
{
void(2+3);
}
如果我没有错的话,将某物强制转换为void的意思不是将表达式强制转换为void
类型的对象(void
是一个没有对象的类型,或者更好地说,是一个空集),而是告诉编译器我们希望忽略表达式的值。其他相关样品:
int main()
{
(void)(2+3);
}
这个样本和另一个样本在语义上有什么区别?
最后:
int main()
{
void();
}
它没有返回任何警告(这里是Coliru测试,充满了与学究相关的选项);然而,另一个会产生一个错误:
int main()
{
(void)();
}
// Error:
// main.cpp:6:9: error: expected primary-expression before 'void'
// (void)();
// ^
// main.cpp:6:9: error: expected ')' before 'void'
void()
表达的含义是什么?您是否正在创建一个类型为void
的临时对象,该对象毫无意义?,还是你把一个空的表达式变成了void?
总的来说,我想了解void用法的全貌,以及标准规定的行为/语义是什么。
这个void(2+3)
不是强制转换,它是一个伪构造函数。是的,void(2+3)
和(void)(2+3)
之间存在语义差异。void(2+3)
是一个隐式类型转换的构造,类似于:void((void)(2+3))
。void()
也是一个合法的伪构造,尽管它有一个伪默认构造函数而不是一个伪复制构造函数。
是的,void()
本质上是创建一个类型为void
的临时对象(尽管正如您所说,您实际上不能拥有void类型的对象,所以您永远不能对它做任何事情;它不能作为参数传递,也不能分配给变量,等等)
强制转换操作表达式:(void) (2+3)
操作表达式(2+3)
。但是()
不是一个合法的表达,所以(void)()
是不合法的。同样,您不能执行static_cast<void>()
或static_cast<void>(())
。
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 在未链接的部分上生成警告
- 警告 C4552:">>":未使用表达式的结果
- 禁止显示由于常量为零而比较始终为假的警告
- C++ 警告:将新创建的 gsl::owner<> 分配给非所有者
- 为什么布尔开关语句有编译器警告?