如果std :: addressof是&的可读版本。什么是*&amp ;?的可读版本?

时间:2017-12-20 18:59:38

标签: c++ c++11 address-operator

*&x

使用c ++ 11,我们可以写成

* std::addressof(x)

但是,这个表达式有更多可读版本吗?

constexpr uint64_t lil_endian = 0x65'6e'64'69'61'6e; 
    // a.k.a. Clockwise-Rotated Endian which allocates like
    // char[8] = { n,a,i,d,n,e,\0,\0 }

constexpr auto& arr = 
    reinterpret_cast<const std::array<char,8> &>
        (*std::addressof(lil_endian) );

int main()
{
    const auto str = std::string(arr.crbegin()+2, arr.crend() );

    std::cout << str << '\n'
              << str.size() << '\n' << '\n';
    for (const auto ch : str) {
        std::cout << ch << " : " << std::hex << (unsigned int) ch << '\n';
    }

}


endian
6

e : 65
n : 6e
d : 64
i : 69
a : 61
n : 6e

godbolt.org/g/9StHsE

wandbox.org/permlink/ZzQ38IlDficO5UOi

3 个答案:

答案 0 :(得分:19)

  

* std::addressof(x)

     

但是,这个表达式有更多可读版本吗?

x

答案 1 :(得分:11)

Vittorio Romeo为您提供第二个问题的答案。

第一个假设是错误的:&#34; addressof&&#34;的可读版本。 addressof用于获取对象的地址,即使其类类型具有重载operator &

答案 2 :(得分:1)

目前还不清楚你要做什么以及为什么要使用constexpr

但是您的代码存在一些问题:

  • reinterpret_cast在常量表达式中为not allowed

  • 使用uint64_t std::arrayconst char*进行别名为not allowed

可以通过在非constexpr上下文中使用#include <iostream> constexpr uint64_t lil_endian = 0x65'6e'64'69'61'6e; int main() { auto arr = reinterpret_cast<const char*>(&lil_endian); for (size_t i = 0; i < sizeof(lil_endian); ++i) { std::cout << arr[i] << " : " << std::hex << (unsigned int) arr[i] << '\n'; } } 进行别名来解决这两个问题。所以以下是合法的:

*&

顺便提一下,sizeof的需求也随之消失。

DEMO

==编辑==

如果您只需要以通用方式获取变量的 size ,只需在函数模板中使用#include <cstdio> #include <cstdint> constexpr uint64_t lil_endian = 0x65'6e'64'69'61'6e; constexpr uint32_t lil_endian32 = 0x65'6e'64'69; template<typename T> void printIt(const T& it) { auto arr = reinterpret_cast<const char*>(&it); for (size_t i = 0; i < sizeof(it); ++i) { putchar(arr[i]); } } int main() { printIt(lil_endian); printIt(lil_endian32); } 即可。例如:

URI.parse

DEMO