首页 > 解决方案 > 将引用转换为另一种类型的引用(first_struct& 到 second_struct&)C++

问题描述

考虑我的实现返回类型

struct first_struct {  TKey key; TValue value;}

接口(这是一个作业)请求类型

struct pair { TKey first; TValue second;}

我实现了接口迭代器:

...
pair& operator*() const {
    return *reinterpret_cast<pair*>(&*iter);  // smooth?
}

private:
Implementation::iter;  // operator* returns `first_struct&`, it's my implementation

这真的是最干净的方法吗?我也想过做一个转换运算符 from first_structtopair&但是 1)first_struct 不应该关心 2)在运算符中,我不知道如何将 pair 的数据成员指向 first_struct 成员的位置,也通过赋值对有数据成员作为值类型,而不是引用。

编辑:

正如 Dan M. 在评论中指出的那样,这会导致 BAD_ACCESS 未定义的行为。reinterpret_cast - cppreference(我希望我理解得很好)

但是我查看了标准草案(因为在cppreference他们提到(在类型别名段落中)char 是例外,但没有关于 char* (我在代码的其他地方在类似情况下使用它)。在标准草案中 - github

8.5.1.10 重新解释演员表

§ 7 对象指针可以显式转换为不同类型的对象指针。当对象指针类型的prvalue v转换为对象指针类型“指向cv T的指针”时,结果为static_cast(static_cast(v))。

§ 11 如果可以使用 reinterpret_cast 将“指向 T1 的指针”类型的表达式显式转换为“指向 T2 的指针”类型,则可以将类型 T1 的泛左值表达式(指定对象 x)强制转换为类型“对 T2 的引用” . 结果是 *reinterpret_cast(p) 的结果,其中 p 是指向“指向 T1 的指针”类型的 x 的指针。

并且没有关于未定义的行为。如果static_cast<cv T*>(static_cast<cv void*>(v))没有引起它(我希望)。所以它应该工作。我是否遗漏了什么或 cppreference 错误,或者标准太新?

标签: c++

解决方案


推荐阅读