我的多晶型符合标准吗?
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。
通常在我编写的代码中,有些类型与布局兼容,但它们是不同的类型,但我仍然希望将它们传递给它们,就好像它们是同一类型一样。这带来了相当多的语法开销,包括必要的转换等。
我(非常)最近想到了一个小帮手混入 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。