C++11 C++;字符串';s内部缓冲区地址未定义行为

C++11 C++;字符串';s内部缓冲区地址未定义行为,c++11,C++11,是c++11标准下的以下未定义行为: (正在尝试获取字符串的内部缓冲区地址) 例如,当s为空时 我知道我们有c_str(),data(),但无论如何 注 这来自于与某人的一场辩论,这并不是为了推广C++11中的黑客编码,代码定义良好,但可能不会达到预期效果。根据21.4.5/2,确切的影响为: 返回:*(begin()+pos)如果pos

是c++11标准下的以下未定义行为:

(正在尝试获取字符串的内部缓冲区地址)

例如,当
s
为空时

我知道我们有
c_str(),data()
,但无论如何


这来自于与某人的一场辩论,这并不是为了推广C++11中的黑客编码,代码定义良好,但可能不会达到预期效果。根据21.4.5/2,确切的影响为:

返回:
*(begin()+pos)
如果
pos
,则返回对具有值的
T
类型的对象的引用
charT()
;不得修改参考值


因此,如果字符串非空,它将返回对内部缓冲区开始的引用。如果为空,则返回对值为
0
char
的引用,其位置为内存,是一个实现细节。

我认为这将为堆栈中的某个位置提供一个地址。由于大多数实现中的小字符串优化

说:

如果pos等于字符串长度,则函数返回对字符串中最后一个字符后面的空字符的引用,该字符不应修改


一旦索引参数大于字符串的大小,您可能会以未定义行为的形式出现问题。

您还有s.data()@Alex是的,问题仍然存在。
&str[str.size()]
始终可以为每个
str
返回指向相同地址的指针?同时,对于非空字符串,
*(str.data()+str.size())
是一个与
&str.back()
相邻的
'\0'
?有趣。@Yakk-Um,不是每一个
str
c_str()
data()
返回一个指针
p
,这样
p+i==&operator[](i)
对于
[0,size()]
中的每个
i
。因此,对于非空字符串,
&str[str.size()]
必须是
'\0'
back()
@T.C.相邻的字符串。我想我现在看到了
data()+i
根据
运算符[](i)
隐式强制
运算符[]
返回连续元素,包括
运算符[](size())
。这也是迫使(char&c:str)
成为连续字符的原因?不,连续迭代器概念涵盖了这一点(在当前的标准提案中)。连续迭代器不会强制空终止符是连续的,但是:这就是数据子句?@Yakk是的,我相信这就是
data()
string
的迭代器不包含空终止符,因此连续迭代器规则不适用于它。cplusplus是非规范性的,在这种情况下不符合标准。这让我很惊讶!谢谢你指出这一点。我认为cplusplus指的是实现了这种行为的特定实现!?我不清楚charT()生成了什么。。。这可能是charT类型的任何值,或者标准是否在某处声明了默认构造的charT()的值?
std::string s;
... = &s[0];