为什么即使尚未初始化字符串[0]也有效?

Eag*_*gle 2 c++ string language-lawyer c++11

考虑这段代码

string str;
cout << str[0] << str.size();
Run Code Online (Sandbox Code Playgroud)

而我得到的是不是一个运行时错误,但是" 0",一个0下面的空间.为什么这可能?

son*_*yao 9

str没有未初始化,它默认为空的std::string; 即它size()0.从C++ 11开始,该标准要求std :: basic_string :: operator []返回对这种情况的null字符的引用.

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

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

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