小编mit*_*ull的帖子

基于通用char []的存储并避免与严格别名相关的UB

我正在尝试构建一个类模板,它在一个适当大的char数组中包含一堆类型,并允许作为单独的正确类型引用访问数据.现在,根据标准,这会导致严格别名违规,从而导致未定义的行为,因为我们char[]通过与其不兼容的对象访问数据.具体来说,标准规定:

如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义:

  • 对象的动态类型,
  • 一个cv限定版本的动态类型的对象,
  • 与对象的动态类型类似的类型(如4.4中所定义),
  • 与对象的动态类型对应的有符号或无符号类型的类型,
  • 一种类型,是有符号或无符号类型,对应于对象动态类型的cv限定版本,
  • 聚合或联合类型,包括其元素或非静态数据成员中的上述类型之一(递归地,包括子聚合或包含联合的元素或非静态数据成员),
  • 一个类型,它是对象动态类型的(可能是cv限定的)基类类型,
  • a charunsigned char类型.

鉴于突出显示的要点的措辞,我提出了以下alias_cast想法:

#include <iostream>
#include <type_traits>

template <typename T>
T alias_cast(void *p) {
    typedef typename std::remove_reference<T>::type BaseType;
    union UT {
        BaseType t;
    };
    return reinterpret_cast<UT*>(p)->t;
}

template <typename T, typename U>
class Data {
    union {
        long align_;
        char data_[sizeof(T) + sizeof(U)];
    };
public:
    Data(T t = T(), U u = U()) { first() = t; second() = u; }
    T& first() …
Run Code Online (Sandbox Code Playgroud)

c++ strict-aliasing undefined-behavior type-punning c++11

11
推荐指数
1
解决办法
783
查看次数