为什么(void)sizeof(param)不是"使用" PARAM?

时间:2014-11-14 21:21:03

标签: c++ visual-studio language-lawyer compiler-warnings suppress-warnings

我的宏定义如下:

#define UNREF_PARAM_1(a)
    do { \
        (void)sizeof(a); \
    } \
    while (0)

摆脱编译器警告。在我正在开展的一个新项目中,VS2013突然再次抱怨一个未引用的形式参数。

奇怪的是,如果我只使用(void)param,它确实有用。 有没有人知道为什么它与(void)sizeof(param)一起使用时不起作用?

1 个答案:

答案 0 :(得分:7)

因为在sizeof(param)中,param是一个所谓的未评估的操作数,因此不会使用 - 也就是说,在运行时不需要。

然而,(void)param确实构成了一种使用方法。

代码内部带有符号的强制转换会调用static_cast。 [expr.static.cast] / 6:

  

任何表达式都可以显式转换为类型 cv void in   在哪种情况下,它成为废弃值表达式(第5条)。

[EXPR] / 10:

  

在某些情况下,表达式仅出现其副作用。这种表达式称为丢弃值表达式。计算表达式并丢弃其值。 [...] 仅当表达式为volatile限定类型的左值时才应用左值到右值转换(4.1) [...]

[basic.def.odr] / 2:

  

表达式可能被评估,除非它是未评估的操作数(第5条)或其子表达式。一个名称显示为可能已评估的变量   表达式是 odr-used ,除非它是一个满足的对象   出现在常量表达式(5.19)和   将立即应用左值 - 右值转换(4.1)

此引文的第一部分指出sizeof(a)不是a的使用,因为a是未评估的操作数 1
显然(void)a可能会被评估。并且因为a当然既不允许出现在常量表达式中也不被声明为volatile,所以不会立即应用左值到右值的转换"因此a使用得很多。


1)这是一个表达式列表,其中x是一个未评估的操作数,来自C ++ 11:

  • typeid(x),其中x不是多态类类型的glvalue
  • sizeof(x)(和sizeof x
  • noexcept(x)
  • decltype(x)
  • alignof(x)alignas(x)