使用之前 void cast 的变量是否有效?

Is is valid to use a variable previously void casted?

看起来这段代码可以被 gcc 接受,尽管标准规定表达式的值在 void 转换的情况下被丢弃。

#include <iostream>

int f(int i) {
    int a = i*2;
    (void)a;
    a++; // looks OK even after void cast
    return a; // looks OK even after void cast
}

int main() {
    std::cout << "f(5): " << f(5) << "\n"; // displays 11
    return f(5);
}

那么通常可以使用更改已被无效转换的变量的值,那么在这种情况下“丢弃”是什么意思?或者依赖它是一种不好的做法?

表达式的结果被丢弃,在您的情况下,这意味着 (void)a 的结果被丢弃。这通常用于避免未使用的变量(或未使用的 return 值)警告。在 (void)a 之后使用 a 是完全没问题的,但是首先使用 (void)a 是没有意义的。

编辑:解决评论中提出的一些问题。 standard 的确切写法是:

Any expression can be explicitly converted to type cv void. The expression value is discarded.

在这种情况下,a 是表达式,它被强制转换为 void,它会丢弃表达式的结果,因此 “(void)a 的结果”。 =27=] 从技术上讲是不正确的: a 的结果被丢弃,因为它被转换为 void - 但也可以认为转换本身的结果被丢弃(本质上,演员什么都不做)。