将引用转换为另一种类型的引用(first_struct& to second_struct&)C ++

时间:2018-05-08 13:25:53

标签: 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

这真的是最干净的方法吗? 我还考虑过将转换运算符从first_struct转换为pair&,但是1)first_struct不应该关心2)在运算符中,我不知道如何将pair的数据成员指向first_struct成员'位置,也可以通过赋值将数据成员作为值类型,而不是引用。

编辑:

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

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

  

8.5.1.10重新解释演员表

     

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

     

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

并且没有任何未定义的行为。如果static_cast<cv T*>(static_cast<cv void*>(v))没有导致它(我希望)。所以它应该工作。我错过了什么或者cppreference是错的,还是标准太新了?

0 个答案:

没有答案