此代码是否根据C ++标准定义良好?这看起来有点哈哈。
#include <string>
char* GetPointer(std::string& s)
{
return &s[0];
}
标准是否确保该代码返回指向存储字符的数组中第一个元素的指针?
答案 0 :(得分:8)
是
basic_string的元素是连续存储的,即对于basic_string s,&amp; *(s.begin()+ n)==&amp; * s.begin()+ n对于[0]中的任何n ,s.size()),或等效地,指向s [0]的指针可以传递给期望指向CharT []数组的第一个元素的指针的函数。
答案 1 :(得分:1)
这是从char
获取std::string
指针的规范方法,所以它没有任何问题。调用者需要注意,如果字符串发生变化,指针将变为无效。
将“看起来很黑”的东西放入函数中会很方便,所以你不必担心它。
答案 2 :(得分:1)
此代码是否根据C ++标准定义良好?
标准是否确保该代码返回指向存储字符的数组中第一个元素的指针?
是的,是的。
但是,您必须意识到指向的字符数组不能保证为空终止。因此,您可能无法将指针传递给需要空终止字符串的函数 - 除非您自己设置终止符。
看起来有点hacky。
看起来似乎如此,但目前这是如何获得内部数组的非const指针。 C ++ 17将添加char* std::string::data()
以使其更清晰。
答案 3 :(得分:1)
是的,将指针返回到一个位置传递给函数的内存中是完全没问题的
如果std::string
按值传递,那将是一个不同的故事。
请记住,返回值的有效性与传递的对象的内部缓冲区有关。