std :: string :: operator []的结果地址是否指向可写的,以空值终止的缓冲区?

Kai*_*ged 2 c++ stl operators stdstring c++03

我正在修改一个接受const char*并使用函数ProcessString的函数.ProcessString是一个函数,它期望以null结尾的字符缓冲区作为char*.缓冲区中的字符可能会也可能不会被修改,如下面的函数签名所定义.为了"弥合差距",我使用临时的std :: string:

void ProcessString( char* str );

void SomeFunction( const char* str )
{
  string temp(str);
  ProcessString( &temp[0] );
}
Run Code Online (Sandbox Code Playgroud)

我的主要问题是关于std :: string :: operator []的保证以及上面&temp [0]返回的地址是否是一个可用的,以null结尾的缓冲区作为char*.其次,其次,还有更好的方法吗?

我正在使用C++ 03.

ild*_*arn 5

在C++ 11中只有明确定义的行为; 在以前的标准中,std::string并不保证其内部缓冲区的连续存储.

然而,虽然该代码在C++ 11中完全没问题,但使用的惯用方法越多std:vector<char>,从C++ 03开始就保证了连续存储:

void ProcessString(char* str);

void SomeFunction(char const* str)
{
    // + 1 for terminating NUL
    std::vector<char> temp(str, str + std::strlen(str) + 1);
    ProcessString(&temp[0]); // or temp.data() in C++11
}
Run Code Online (Sandbox Code Playgroud)

  • @James:`c_str`被允许添加NUL,直到调用`c_str`,不要求存在."程序不得改变"是对用户可以对结果指针做什么的限制(例如,没有`const_cast`然后修改),而不是对`c_str`实现者的限制. (3认同)
  • @ Ben,C++ 11承诺`operator [](size())`是对nul字符的引用,与`c_str`无关.但是,我没有看到`&operator [](size())`紧跟`&operator [](size() - 1)`的要求,除了`c_str`的​​描述. (2认同)
  • @Kaiged:在C++ 11中,`std :: basic_string <>`和`std :: vector <>`都保证有连续的存储空间.在C++ 03中,只有`std :: vector <>`才有这种保证.在C++ 98中,两者都没有这种保证.问题是您正在使用的编译器遵循哪个标准. (2认同)