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
。
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
。