1

*&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

4

3 回答 3

19

* std::addressof(x)

但是,这个表达式是否有更易读的版本?

x

于 2017-12-20T19:02:52.447 回答
11

维托里奥·罗密欧给你第二个问题的答案。

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

于 2017-12-20T19:07:43.020 回答
1

目前尚不清楚您要做什么以及为什么使用constexpr.

但是您的代码有几个问题:

但是,您可以const char*通过在非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在函数模板中使用即可。例如:

#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);
}

演示

于 2017-12-20T20:04:58.180 回答