std::string
提供const char*c_str()const:
获取C字符串等效项
生成以字符串对象为内容的以null结尾的字符序列(c-string),并将其作为指向字符数组的指针返回.
将自动附加终止空字符.
返回的数组指向一个内部位置,该位置具有此字符序列所需的存储空间及其终止的空字符,但此数组中的值不应在程序中修改,只有在下次调用时才会保持不变.字符串对象的非常量成员函数.
他们为什么不定义operator const char*() const {return c_str();}
?
从C++编程语言20.3.7(强调我的):
转换为C风格的字符串可能是由运算符const char*()而不是c_str()提供的.在这种转换出乎意料的情况下,这将提供隐式转换的便利,但会以惊喜为代价.
我看到隐式转换至少有两个问题:
即使是c_str()
提供的显式转换也足够危险.我已经看到很多情况下指针存储在原始字符串对象的生命周期结束后使用(或者对象被修改从而使指针无效).通过明确打电话给c_str()
你,希望能够意识到这些问题.但是通过隐式转换,很容易导致未定义的行为,如:
const char *filename = string("/tmp/") + name; ofstream tmpfile(filename); // UB
转换也会在某些情况下发生,在这种情况下,您不会期望它,并且至少可以说语义令人惊讶:
string name; if (name) // always true ; name-2; // pointer arithmetic + UB这些可以通过某种方式避免,但为什么要首先陷入这个麻烦?
Josuttis的书中说明如下:
出于安全原因,这是为了防止导致奇怪行为的非预期类型转换(类型
char *
通常具有奇怪的行为)和歧义(例如,在组合astring
和C字符串的表达式中,它可以转换string
为char *
反之亦然) .