在c ++ 11标准下是否存在以下未定义的行为:
(试图获取字符串内部缓冲区的地址)
std::string s;
... = &s[0];
例如s
为空?
我知道我们有c_str(), data()
,但不过。
这是来自与某人的辩论,这不是为了促进hacky编码
答案 0 :(得分:7)
在C ++ 11中,代码定义明确,但可能无法达到预期效果。确切的影响是,根据21.4.5 / 2:
返回:
*(begin() + pos)
ifpos < size()
,否则引用T
类型的对象charT()
;参考值不得修改。
因此,如果字符串非空,则返回对内部缓冲区start的引用。如果它为空,则返回对char
的引用,其值为0
,其位置为内存是实现细节。
答案 1 :(得分:0)
我认为这会在你的堆栈的某个地方给你一个地址。由于大多数实现中的小字符串优化。
http://www.cplusplus.com/reference/string/string/operator[]/说:
如果pos等于字符串长度,则该函数返回对字符串中最后一个字符后面的空字符的引用,该字符不应被修改。
只要index-parameter大于string的大小,就可能会以未定义的行为形式出现问题。