std::string::c_str()
возвращает указатель на массив, содержащий последовательность символов с нулевым завершением (т.е. C-строку), представляющую текущее значение строкового объекта.
В С++ 98 требовалось, чтобы "программа не изменяла ни одного из символов в этой последовательности". Это было вызвано возвращением const char *.
IN С++ 11 "возвращаемый указатель указывает на внутренний массив, используемый в настоящее время строковым объектом для хранения символов, соответствующих его значению", и я считаю, что требование не изменять его содержимое было отброшено. Это правда?
Является ли этот код ОК на С++ 11?
#include<iostream>
#include<string>
#include<vector>
using namespace std;
std::vector<char> buf;
void some_func(char* s)
{
s[0] = 'X'; //function modifies s[0]
cout<<s<<endl;
}
int main()
{
string myStr = "hello";
buf.assign(myStr.begin(),myStr.end());
buf.push_back('\0');
char* d = buf.data(); //C++11
//char* d = (&buf[0]); //Above line for C++98
some_func(d); //OK in C++98
some_func(const_cast<char*>(myStr.c_str())); //OK in C++11 ?
//some_func(myStr.c_str()); //Does not compile in C++98 or C++11
cout << myStr << endl; //myStr has been modified
return 0;
}