Пусть у нас есть этот объект
constexpr uint64_t lil_endian = 0x65'6e'64'69'61'6e; // 00en dian
// a.k.a. Clockwise Rotated Endian which allocates like
// char[8] = { 'n','a','i','d','n','e','\0','\0' }
Считается, что memcpy
также помогает каламбурить вот так
char arr[sizeof(lil_endian)];
auto p1 = std::addressof(arr[0]);
std::memcpy(p1, &lil_endian, sizeof(lil_endian) ); // defined?
auto sv1 = std::string_view(p1, sizeof(lil_endian) );
std::string str1(sv1.crbegin()+2, sv1.crend() );
std::cout << str1 << "\n"
<< str1.size() << "\n";
все ожидаемо:
endian
6
Дело в том, что даже с одним string_view
мы все равно обращаемся к объекту через char
, который char
является одним из трех допустимых псевдонимов char
, unsigned char
, std::byte
.
Итак, можем ли мы просто пропустить избыточную часть кода, как здесь?
auto p2 = reinterpret_cast<const char *>
( &lil_endian );
auto sv2 = std::string_view(p2, sizeof(lil_endian) ); // is this "char" aliasing?
std::string str2(sv2.crbegin()+2, sv2.crend() );
std::cout << str2 << "\n"
<< str2.size() << "\n";
}
выход:
endian
6
Является ли конструктор string_view(const char*, size_type) "char" псевдонимом строгим псевдонимом ( [basic.val]/11) -- § 8.2.1 ¶ 11 в N4713 стр. 82
char
,unsigned char
иstd::byte
? Это прямо там, в разделе, на который вы ссылаетесь в 11.8. Псевдоним черезconst char*
совершенно законен и хорошо определен. - person Nathan Ernst   schedule 29.01.2018string_view
внутри простоconst char*
или доступ черезconst char*
действительно является доступом черезchar
? - person Barry   schedule 29.01.2018trivially_copyable
s конструкторомstring_view
. Что ж, если вы считаете, что все в порядке, вы можете написать ответ на это или на 47921786 или даже на оба! ...было бы замечательно. Я думаю, нам просто нужен эксперт, чтобы подтвердить нас об этом. - person sandthorn   schedule 07.02.2018