*&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
答案 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::array
对const 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
的需求也随之消失。
==编辑==
如果您只需要以通用方式获取变量的 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