c++ - 将引用转换为另一种类型的引用(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_struct
topair&
但是 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 错误,或者标准太新?
解决方案
推荐阅读
- javascript - 使用 MomentJS 转换日期时遇到问题
- java - 附加到新的 StringBuilder 输出时使用 %d 保持双重格式
- android-fragments - 带有导航图和 1 个活动应用程序的 Kotlin FCM 推送通知
- javascript - 是否可以从弹出面板中修剪文本区域中的文本?
- java - 来自不同类的静态变量的问题
- python - 如何在 tkinter 中将文本标签居中?
- plot - Seaborn regplot y_test 和预测的样本量
- c# - 使用 Bot Framework v4,我如何确定 OAuthPrompt 是刚刚登录还是令牌已经存在?
- javascript - addEventListener 不进入 else
- realm - 升级到最新的领域版本 5.0 后在 swift 中写入双精度时领域崩溃