4

让我们有这个对象

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) 是否通过严格别名([basic.val]/11)进行“char”别名 - N4713 第 82 页中的第 8.2.1 节 ¶

神螺栓

魔杖盒

4

0 回答 0