即使它为空,如何获得指向非const std :: string的第一个元素的指针。
我确定该字符串的容量大于1,但是,只需使用
&my_string.front()
触发“超出范围的迭代器”声明失败,因为字符串为空。 使用成员函数
data()
也不适合,因为我想要一个char *类型的指针,而不是const char *类型的指针。我想我可以在这里执行const_cast,但这看起来并不整洁。
有更好的方法吗?
答案 0 :(得分:3)
不幸的是,要让string::data()
返回char*
,您必须升级到C ++ 17。如果确实需要对基础数据进行写访问,则data()
的const_cast结果可能是可行的选择。
答案 1 :(得分:3)
尽管front()
会丢到这里,但my_string[my_string.size()]
如今被认为是有效的–您不能做很多事,但是you can take and store its address(所以&my_string[0]
)。
但是,这样做只有可疑的价值。因此,您可能会假设第一串字符插入(直到当前容量)实际上不会使指针无效,但是您的代码将是不清楚的正确性,如we are specifically told by string.require¶4 not to rely on it:
引用
basic_string
对象的引用,指针和迭代器可能因以下basic_string
对象的使用而无效:
- 作为任何标准库函数的参数,并以非常量
basic_string
作为参数。- 调用非常量成员函数,但
operator[]
,at
,data
,front
,back
,begin
,{{1 }},rbegin
和end
。
因此,我们真的不能保证所指向的特殊“空”缓冲区实际上将与最终用于存储实际字符串的缓冲区相同(尽管该缓冲区也将以相同的方式保证以null终止)。当然,一旦您超过能力极限,所有赌注就会完全消失,您真的要跟踪该事件吗?
听起来好像rend
不是您想要的,或者您应该在{em> as and when 时访问std::string
,而不是一次调用它然后存储结果指针。
如果要与需要存储此指针的某些C API进行交互,我将切换到其他内容,也许是固定长度的字符缓冲区。在C ++方面,您仍然可以使用std::string_view
对类似C的字符缓冲区进行令人愉悦的(只读)操作,因此不会丢失任何内容。
data()