我如何获得指向std :: string的第一个元素的指针,即使它为空

时间:2018-09-11 10:48:45

标签: c++ stdstring

即使它为空,如何获得指向非const std :: string的第一个元素的指针。

我确定该字符串的容量大于1,但是,只需使用

&my_string.front()

触发“超出范围的迭代器”声明失败,因为字符串为空。 使用成员函数

data()

也不适合,因为我想要一个char *类型的指针,而不是const char *类型的指针。我想我可以在这里执行const_cast,但这看起来并不整洁。

有更好的方法吗?

2 个答案:

答案 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[]atdatafrontbackbegin,{{1 }},rbeginend
  •   

因此,我们真的不能保证所指向的特殊“空”缓冲区实际上将与最终用于存储实际字符串的缓冲区相同(尽管该缓冲区也将以相同的方式保证以null终止)。当然,一旦您超过能力极限,所有赌注就会完全消失,您真的要跟踪该事件吗?

听起来好像rend不是您想要的,或者您应该在{em> as and when 时访问std::string ,而不是一次调用它然后存储结果指针。

如果要与需要存储此指针的某些C API进行交互,我将切换到其他内容,也许是固定长度的字符缓冲区。在C ++方面,您仍然可以使用std::string_view对类似C的字符缓冲区进行令人愉悦的(只读)操作,因此不会丢失任何内容。

data()