【问题标题】:Is is valid to use a variable previously void casted?使用以前 void 强制转换的变量是否有效?
【发布时间】:2021-02-18 10:07:05
【问题描述】:

看起来这段代码对于 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 强制转换的变量的值,那么在这种情况下“丢弃”是什么意思?或者依赖它是一种不好的做法?

【问题讨论】:

  • 我认为您可以检查此链接以解决您的问题; stackoverflow.com/questions/34288844/….
  • 你肯定误解了那部分的标准。
  • a 的值是检索然后丢弃的表达式的结果。 a的原始内容不受影响。
  • 我认为您将变量的值与变量本身混淆了。演员阵容对演员阵容的论点没有任何影响。
  • 并非如此,(1) 它可能会在对象上调用 operator int,并且 (2) 您可以将事物转换为 char&amp; 并分配给它(通常会导致未定义的行为)。

标签: c++ casting void


【解决方案1】:

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

编辑:解决 cmets 中提出的一些问题。 standard 的确切措辞是:

任何表达式都可以显式转换为 cv void 类型。这 表达式值被丢弃。

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

【讨论】:

  • *表示a的结果被丢弃。
  • @user202729 恕我直言 “意味着 (void)a 的结果被丢弃。” 更好地描述了它。 C 风格转换的结果被丢弃。
  • @ThomasSablik - 从技术上讲,两者兼而有之。 (AnyType)a 具有评估a 并将结果转换为AnyType 的效果(如果转换有效)。将其单独放在一个语句中,具有丢弃(AnyType)a 的结果的效果。 AnyTypevoid 的特殊情况具有丢弃a 的效果,然后丢弃丢弃a 的结果。 无论如何,大多数现代编译器都可以在aint 的语句中单独检测到(void)a 没有净效应,并且很可能根本不会发出任何指令,除非在调试版本中。
  • @Peter 是的,这很清楚。但恕我直言,“表达式的结果被丢弃,在你的情况下,这意味着(void)a 的结果被丢弃。”“这意味着结果的a 被丢弃。” 即使两者都是正确的。前者更好地描述了为什么a 没有改变。 (void)a 是一个演员表,演员表的结果被丢弃。它不会改变a。我从来没有说过其中一个句子是错误的。
  • “表达式的结果被丢弃,在你的情况下,这意味着 (void)a 的结果被丢弃”。是为了让事情更容易理解。从 OP 阅读标准的问题中可以清楚地看出,重新迭代标准所说的内容是没有意义的,即:“任何表达式都可以显式转换为 cv void 类型。表达式值被丢弃”(在这个case a 是表达式)。
猜你喜欢
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多