std::string_view赋值或拷贝构造后二者的data()指针是否保证相等?
结论:你给出的
assert(b1.data() == b3.data());断言一定成立。 原理说明
std::string_view是C++17引入的轻量字符序列视图,本身不持有任何字符数据,内部仅存储两个核心成员:指向底层字符序列起始位置的const char*指针,以及表示序列长度的size_t值,所有操作都基于这两个成员完成。- 根据C++标准对
std::basic_string_view拷贝语义的强制要求:拷贝构造或者拷贝赋值生成的
std::string_view对象,必须与原对象持有完全相同的起始指针和长度值。 - 拷贝操作不会触发底层字符数据的复制,也不会修改视图指向的地址,仅仅是复制原视图内部的指针和长度值,因此拷贝得到的新视图和原视图的
data()返回值必然相等。
补充说明
需要注意std::string_view的operator==重载和指针比较的语义差异:
a == b比较的是两个视图对应的字符内容是否完全相同,和底层指针没有关系,这也是你示例中b1 == b2为真,但b1.data() != b2.data()的原因。- 只有基于同一个视图拷贝生成的视图,才会满足
data()指针相等的条件。
示例代码对应验证:
const char* base = "foo[blah]bar[blah]"; std::string_view b1{base + 4, 4}; // 指向第一个"blah" std::string_view b2{base + 13, 4}; // 指向第二个"blah" assert(b1 == b2); // 此处仅为字符串内容比较,成立 assert(b1.data() != b2.data()); // 底层数据指针不同,成立 std::string_view b3 = b1; // 创建b1的副本,仅复制指针和长度 assert(b1.data() == b3.data()); // 该断言永远成立
内容的提问来源于stack exchange,提问作者Suan Yong
相关产品推荐
相关产品推荐

