通常在我编写的代码中,有些类型是布局兼容的但是类型不同,但我仍然希望将它们传递给它们,就好像它们是相同的类型一样。这带来了相当多的语法开销,包括必要的强制转换等。
我(非常)最近想到了一个小助手混合课程,我称之为polymorph
:
struct polymorph
{
template<typename T>
const T& as() const { return reinterpret_cast<const T&>(*this); }
template<typename T>
T& as() { return reinterpret_cast<T&>(*this); }
}
一个小例子&#34;展示&#34;它对于经典的#34;我的复数类型比你的更好&#34;情况here *。 我的问题是:这个类有多强大,我怎样才能使它更能抵御滥用和/或未定义的行为。我没有经常使用它而且有点犹豫,因为有很多事情可能会非常错误。
此课程主要用于_Complex
/ std::complex<double>
/ double[2]
之间的通信。我还在考虑一种很好的方法来扩展它以执行有用的转换,以及确切的有用性。
*注意我并不是说这完全是未定义的 - 没有行为。因此这个问题。
答案 0 :(得分:3)
您违反了[basic.lval] / 8,通常称为&#34;严格别名规则&#34;。它表示您可能无法通过与指向的对象不同类型的指针访问对象,但有许多例外(指向基类的指针,unsigned char*
,const
/ {{1}差异等)。布局兼容性不是这种考虑的一部分。
是的,这是UB。