GCC 在执行 static_cast 时将引用转换为临时引用以取消指针引用

GCC converts reference to temporary when doing static_cast to void pointer reference

GCC 在编译以下代码时产生警告:

void* const & cast(int* const &ptr)
{
    return static_cast<void* const &>(ptr);
}

警告是“正在返回对临时文件的引用” (coliru)。

Clang 编译代码时没有警告 (coliru).

哪个编译器是正确的?为什么参考转换为临时?

另请注意,将 static_cast 更改为 reinterpret_cast 可修复警告 (coliru)。

Clang 12 here 给了我一个类似的警告。您链接到的那个可能已经过时了。

代码已损坏,您 return 悬空引用。

reinterpret_cast 不同,static_cast 将拒绝重新解释引用。相反,它将从原始指针构造一个 void *1 类型的临时对象,并形成对它的引用(这是允许的,因为引用是 const) .

请注意,改为执行 reinterpret_cast,然后对结果引用执行 reading/writing,这违反了严格的别名并导致未定义的行为。


1 认为 它是 void * 而不是 void *const 因为 [expr.type]/2