【发布时间】:2020-11-07 16:29:49
【问题描述】:
考虑以下代码sn-p:
using A = void(*)(int);
A foo(const void* ptr)
{
return reinterpret_cast<A>(ptr);
}
GCC 10 非常喜欢这个。但是,clang++-10 说这是一个错误!
<source>:5:12: error: reinterpret_cast from 'const void *' to 'A' (aka 'void
(*)(int)') casts away qualifiers
return reinterpret_cast<A>(ptr);
^~~~~~~~~~~~~~~~~~~~~~~~
函数在 C++(和 C)中是不可变的,并且没有“const 函数”。那么为什么clang++在这里抱怨呢?
【问题讨论】:
-
@OutOfBound:偷偷摸摸! ......但是 - 它不起作用。在 GodBolt 链接上执行此操作,您会看到函数返回类型必须更改。
-
因为你不能用 reinterpret_cast 抛弃 const 限定符。没关系,函数指针是不可变的。
-
关于将函数指针转换为数据指针,反之亦然,难道没有一些重要的警告吗? (常规函数指针,而不是完全不同的成员函数指针。)
-
AFAIK 将函数指针转换为
void*是非法的,这样会使 clang 正确。 -
@NathanOliver:如果是
void*,clang 不会抱怨。
标签: c++ function-pointers clang++ reinterpret-cast const-correctness