C++ 为什么即使字符串[0]尚未初始化,获取它也是有效的?

C++ 为什么即使字符串[0]尚未初始化,获取它也是有效的?,c++,string,c++11,language-lawyer,C++,String,C++11,Language Lawyer,考虑一下这个代码 string str; cout << str[0] << str.size(); string-str; coutstr不是未初始化的,它是一个空的std::string;i、 e.其size()为0。从C++11开始,标准要求在这种情况下返回对空字符的引用 如果pos==size(),则返回对具有值CharT()(空字符)的字符的引用 值得注意的是,在C++11之前,对于操作符[]的非常量版本,这是未定义的行为,对于常量版本,将返回对null字符的

考虑一下这个代码

string str;
cout << str[0] << str.size();
string-str;

cout
str
不是未初始化的,它是一个空的
std::string
;i、 e.其
size()
0
。从C++11开始,标准要求在这种情况下返回对空字符的引用

如果
pos==size()
,则返回对具有值
CharT()
(空字符)的字符的引用

值得注意的是,在C++11之前,对于
操作符[]
的非常量版本,这是未定义的行为,对于常量版本,将返回对null字符的引用;由于C++11用于非常量版本,因此对返回的引用上的其他字符的任何修改都是未定义的行为


顺便说一句:意味着一切皆有可能;它不一定是运行时错误。

std::string()
是空字符串。同样,即使你做了违法的事情,也不能保证你会得到运行时错误。你会得到的是未定义的行为。这是一个很好的问题。为什么投票数这么少?这是一个很好的答案!我认为试图通过引用来修改角色是错误的。值得补充吗?@p45我想我已经提过了。。“由于C++11,对返回引用上其他字符的任何修改都是未定义的行为。”