C++ 允许向空(而不是指针)浇铸,为什么?

C++ 允许向空(而不是指针)浇铸,为什么?,c++,language-lawyer,C++,Language Lawyer,为什么我可以将这个向量转换为空(甚至不是指针) intmain() { std::载体a; (a)无效; } 为什么允许这样做?强制转换为无效只会丢弃表达式的结果。有时,您会看到人们使用它来避免“未使用变量”或“忽略返回值”警告 在C++中,你应该编写静态分析(EXPR);代码>而不是(void)expr 这与丢弃该值具有相同的效果,同时明确执行的是哪种类型的转换 标准上说: 任何表达式都可以显式转换为cv void类型,其中 如果它成为一个废弃的值表达式(第5条)。[注: 但是,如果该值位于

为什么我可以将这个向量转换为空(甚至不是指针)

intmain()
{
std::载体a;
(a)无效;
}

为什么允许这样做?

强制转换为无效只会丢弃表达式的结果。有时,您会看到人们使用它来避免“未使用变量”或“忽略返回值”警告

<>在C++中,你应该编写<代码>静态分析(EXPR);代码>而不是
(void)expr

这与丢弃该值具有相同的效果,同时明确执行的是哪种类型的转换

标准上说:

任何表达式都可以显式转换为cv void类型,其中 如果它成为一个废弃的值表达式(第5条)。[注: 但是,如果该值位于临时对象(12.2)中,则析构函数 对于该对象,直到通常的时间才执行 保留该对象是为了执行析构函数。 -[完注]


ISO/IEC 1488~2011年5.2.9标准。6

这是一个废弃的值表达式。它丢弃该值。顺便说一下,不要使用C样式转换。这是一种常见的方法(但不是更好的方法)删除关于未使用变量的警告。我不知道为什么允许使用它,但有时我会使用它来防止未使用变量的编译器警告。有没有机会获得标准引号?它通常用于抑制关于未使用函数参数的警告,而未使用函数参数对
(void)expr?这仅仅是因为不使用C-cast,还是有实际的理由避免使用C-cast版本?@nwp-就像往常一样。铸造空心并没有什么特别之处,但这里没有一个常见的原因。没有转换发生,所以这种转换甚至没有意义。没有理由搜索强制转换,因为它除了关闭编译器警告之外什么都不做。弱代码没有掩蔽。这只是遵循规则的规则,不是为了一个目的。使用<代码> StasyType Studio<代码>相当尴尬,语法<代码>(无效) >它们之间没有什么区别。在旧的标准被弃用的情况下,仍然确认新的C++标准是一个好主意。
int main()
{
   std::vector<int> a;
   (void)a;
}