以下代码如何工作?

Jex*_*xcy 24 c++ templates v8

    #define TYPE_CHECK(T, S)                                     \
    while (false) {                                              \
      *(static_cast<T* volatile*>(0)) = static_cast<S*>(0);      \
    }
Run Code Online (Sandbox Code Playgroud)

我正在阅读谷歌v8的代码,发现上面的宏进行类型检查.

但是,我不明白为什么会这样.虽然(假)永远不会被执行,对吧?有人可以解释这些线吗?谢谢

Aas*_*set 12

相当奇特的黑客 - 宏的目的似乎是检查类型S是否可分配给(即,是类型的子类)T.如果不是,则从中转换S*为的指针T*将产生编译器错误.在while (false)从实际上具有任何其他效果防止了代码.


Ale*_*ler 7

是的,但编译器仍然对循环内容执行语法和语义检查.因此,如果出现问题(即,来自S*to 的隐式类型转换T*是非法的,如果T既不是S也不是基类,则会发生S),编译失败.否则,生成的机器代码的质量不会受到影响,因为优化器将检测到无法访问的代码并以静默方式将其删除.

  • 演员总是合法的.代码正在测试是否存在从"S*"到"T*"的标准转换.(`T`可能是`S`的基类.) (2认同)