std::string の途中に null 文字が含まれている場合の処理

Twitter で見かけたんですが、次のように途中に null 文字が含まれている場合でも最後まで出力されます。

#include <string>
#include <vector>
#include <iostream>


int
main(){
    std::vector<char> chars { 'h', 'o', '\0', 'm', 'e' };
    std::string str(chars.begin(), chars.end());
    std::cout << str.c_str() << std::endl;
    std::cout << str.length() << std::endl;
    std::cout << str.find('m') << std::endl;
    return 0;
}
/*
output:
home
ho
5
3
*/

std::string::lengthstd::string::find とかも問題なく最後まで処理されます。
これはちょっと以外だった。
これ、内部だとどういう風になってるのかな。 あと当然ですが std::string::c_str 等で char* に変換した場合は ho までしか出力されません。