在下面的情况下,我尝试将指向结构的指针转换为指向另一个结构的指针(该结构在幕后具有相同的内存布局)。我尝试以 const 正确的方式执行此操作,但是编译器正在抱怨。
我查看了类似的问题,但我需要常量来传播,但它不像我所描述的那样工作。
struct queue
{
// ...
};
typedef struct queue* queue_handle;
struct dummy_queue
{
// ...
};
struct queue_wrapper
{
auto get_queue() const -> queue_handle {
return reinterpret_cast<const queue_handle>(&d);
}
dummy_queue d;
};
int main()
{
queue_wrapper w;
w.get_queue();
}
错误:
<source>: In member function 'queue* queue_wrapper::get_queue() const':
<source>:17:16: error: 'reinterpret_cast' from type 'const dummy_queue*' to type 'queue_handle' {aka 'queue*'} casts away qualifiers
17 | return reinterpret_cast<const queue_handle>(&d);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我正在转换为 const 指针(gcc 似乎以某种方式误解了)。返回后我不需要更改指针。如何才能无错误地完成此转换?
const queue_handle
将 const
应用于指针类型本身,而不是您想要的指向的类型。
如果您已经在为指针使用别名,我建议为
const_queue_handle
添加一个 const queue*
别名(这是否是一个好主意取决于意见),然后您可以将其用作 reinterpret_cast
的模板参数
.
还要注意,即使结构布局相同,这仍然是未定义的行为领域。编译器可能会假设指向其中一种结构类型的指针不会将一种结构类型别名为另一种结构类型,并将其用于优化。执行此操作时,您可能至少应该使用
-fno-strict-aliasing
编译所有内容。