gpt4 book ai didi

c++ - 为什么 std::string::data 的 const 重载在现代 C++ 中仍然受到限制?

转载 作者:太空狗 更新时间:2023-10-29 20:01:37 29 4
gpt4 key购买 nike

std::basic_string::dataits specification 下的要求.

[string.accessors] (emphasis mine)

const charT* c_str() const noexcept;
const charT* data() const noexcept;

1 Returns: A pointer p such that p + i == &operator[](i) for each i in [0, size()].

2 Complexity: Constant time.

3 Requires: The program shall not alter any of the values stored in the character array.

这在 C++03 中对 c_str 有意义因为它不需要返回指向实际字符串缓冲区的指针,并且对于 data因为 COW 是一种可能的实现策略。即使缓冲区不是真正的 const,修改 data会干扰 COW 的不变量。

但由于 C++11 COW 是不允许的,c_strdata返回相同的指针,它指向缓冲区 operator[]将允许修改。那么为什么要通过 const_cast<CharT*>(s.data()) 修改指针呢?仍然是明确未定义的行为?有实际原因吗?

最佳答案

I'm not talking about a const std::string, but a non-const one.

这就是该语句存在的原因(并且在添加非const data 时甚至在 C++17 中继续存在)。因为 data 不知道

在优化的小字符串string 实现中,string 对象本身存储一个字符数组。如果该 string 对象被声明为 const,那么它的子对象也是如此。 Modifying objects declared as const is UB .

相比之下,vector::data 没有这样的声明,因为 const vector 总是 堆分配它的数组。因此,虽然从外部看数组在逻辑上是 const,但它在技术上是明确定义的(但你真的,真的不应该)到 const_cast const vector::data 的返回值,因为您要修改的对象不是 const

如果 basic_string::data 没有这样的声明,基于 SSO 的实现将是不可能的,因为修改 的元素是合法的 const string,就像修改 const vector 的元素是合法的一样。但是修改它是不合法的,因为它可能是一个 const 对象,其数据存储在内部。

关于c++ - 为什么 std::string::data 的 const 重载在现代 C++ 中仍然受到限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56434272/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com