根据this answer,for i in 1...10 {
print(String(format: "%2d", i))
}
的内部缓冲区不能保证在C ++ 11之前的标准下是连续的。 (尽管几乎所有实现都使用连续的内存)
这意味着,从技术上讲,访问返回值std::string
或string::data()
的第n个(n> 0?)元素会导致未定义的行为。这是对的吗?
string::c_str()
答案 0 :(得分:3)
不,因为C ++ 98的规范清楚地说明了你得到了什么:一个连续的字符数组。
字符串存储的内部实现不一定反映在方法结果中。如果字符串没有存储在一个部分中,那么方法必须确保您获得所需的内容。这可能意味着整个内容被复制到不同的地方。
这就是为什么你不应该改变你得到的字符串表示的原因。
您和实施这些方法的人必须仔细阅读描述您所得到的标准。
答案 1 :(得分:0)
str.c_str()[...];
没问题,只要你没有跑掉字符串的末尾。毕竟,它是一个C字符串,你还期待什么呢?
至于str.data()
,cppreference就是这样说的:
const CharT* data() const
返回指向作为字符存储的基础数组的指针。指针是范围[data(); data()+ size())有效,其中的值对应于存储在字符串中的值。
现在我不知道这是否完全值得信赖,但是cppreference不会将该声明限定为适用于任何特定版本的标准。但是,可能应该这样做。