Если std :: addressof является читаемой версией & amp; Что такое читаемая версия * & amp ;?

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

1

Решение

* std::addressof(x)

Однако есть ли более читаемая версия этого выражения?

x

19

Другие решения

Витторио Ромео даст вам ответ на второй вопрос.

Первое предположение неверно: «Есть addressof читаемая версия &». addressof используется для получения адреса объекта, даже если его тип класса перегружен operator &,

11

Непонятно, что вы пытаетесь сделать и почему вы используете 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';
}

}

Кстати, также необходимость *& исчезает.

DEMO

== РЕДАКТИРОВАТЬ ==

Если вам просто нужно, чтобы овладеть размер переменной в общем виде, просто используйте 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);
}

DEMO

1
По вопросам рекламы [email protected]