我的多晶型符合标准吗?

How standards-compliant is my polymorph?

通常在我编写的代码中,有些类型与布局兼容,但它们是不同的类型,但我仍然希望将它们传递给它们,就好像它们是同一类型一样。这带来了相当多的语法开销,包括必要的转换等。

我(非常)最近想到了一个小帮手混入 class,我将其命名为 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); }
}

一个小例子 "demonstrating" 它用于 class 典型 "my complex number type is better than yours" 情况 here*。 我的问题是:这个 class 有多健壮,我怎样才能让它更有弹性地防止误用 and/or 未定义的行为。我没有经常使用它并且有点犹豫,因为有很多事情可能会出错。

这个class主要用于通信,例如_Complex/std::complex<double>/double[2]之间的通信。我仍在考虑一种很好的方法来扩展它以执行有用的转换,以及它到底有多有用。

*注意我并不是说这完全没有未定义行为。因此这个问题。

您违反了[basic.lval]/8,俗称"strict aliasing rule"。它说您不能通过与所指向对象类型不同的指针访问对象,但有许多例外情况(指向基 类、unsigned char*const/ 的指针volatile 差异等)。布局兼容性不是该考虑的一部分。

所以是的,这是 UB。