Является ли доступ к представлению объекта с помощью конструктора string_view(const char*, size_type) определенным псевдонимом char или неопределенным поведением?

Пусть у нас есть этот объект

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

богболт

wandbox


person sandthorn    schedule 29.01.2018    source источник
comment
Разве вы не видите явное исключение, предоставленное char, unsigned char и std::byte? Это прямо там, в разделе, на который вы ссылаетесь в 11.8. Псевдоним через const char* совершенно законен и хорошо определен.   -  person Nathan Ernst    schedule 29.01.2018
comment
Вы, кажется, ответили на свой вопрос в вопросе. В какой части этого вы не уверены? Является ли string_view внутри просто const char* или доступ через const char* действительно является доступом через char?   -  person Barry    schedule 29.01.2018
comment
@NathanErnst Я не уверен. Потому что в прошлом месяце оба ответа 47921786 не подтвердили, что это определено.   -  person sandthorn    schedule 30.01.2018
comment
@Barry Вы можете пометить это как дубликат, но дело в том, что оба ответа 47921786 не подтвердили, что это определено.   -  person sandthorn    schedule 30.01.2018
comment
@sandthorn Что? Я пытаюсь понять ваш вопрос. Что является источником путаницы?   -  person Barry    schedule 30.01.2018
comment
@Barry Источник моего замешательства в том, что оба ответа 47921786 кажутся недостаточно уверенными, чтобы сказать, что это okey, чтобы переинтерпретировать указатель на char, затем оберните trivially_copyables конструктором string_view. Что ж, если вы считаете, что все в порядке, вы можете написать ответ на это или на 47921786 или даже на оба! ...было бы замечательно. Я думаю, нам просто нужен эксперт, чтобы подтвердить нас об этом.   -  person sandthorn    schedule 07.02.2018