as_bytes函数的精确定义

时间:2017-09-08 04:52:13

标签: c++

我在阅读时发现了这个功能,我无法在CPPreference

找到它的定义
  

Bjarne stroustrup的编程原则

以这种方式使用:

ifs.read(as_bytes(x),sizeof(int));`

我了解read的工作原理,但您仍可以使用to_bytes标准定义来帮助我。

1 个答案:

答案 0 :(得分:2)

as_bytes函数返回参数第一个字节的地址(因此read调用将覆盖对象x)。因此,在C ++ 11或更高版本中,可以按如下方式编写该函数:

template <class T>
char* as_bytes(T& x) {
    return &reinterpret_cast<char&>(x);
    // or:
    // return reinterpret_cast<char*>(std::addressof(x));
}

评论中链接的版本早于C ++ 11。据推测Stroustrup首先转换为void*的原因是因为reinterpret_cast无法保证在C ++ 03中做正确的事情。另请注意,对于具有重载&运算符的参数,旧版本将无法正常工作。