STL字符串类中的运算符char*

Pal*_*avi 7 c++ stl

为什么STL字符串类没有内置的重载char*运算符?他们有什么特别的理由要避免吗?

如果有一个,那么使用带C函数的字符串类将变得更加方便.

我想知道你的看法.

Nav*_*een 16

以下是Josuttis STL书中的引用:

但是,没有从字符串对象到C字符串的自动类型转换.出于安全原因,这是为了防止导致奇怪行为的非预期类型转换(类型char*通常具有奇怪的行为)和歧义(例如,在组合字符串和C字符串的表达式中,可以将字符串转换为char*,反之亦然).相反,有几种方法可以在C字符串中创建或写入/复制,特别是,提供c_str()来生成字符串的值作为C字符串(作为具有'\ 0'的字符数组它的最后一个字符).

  • 在我工作的地方,我们有一个遗留库,它有一个字符串,自动转换为const char*.我无法计算应用程序开发人员添加字符串和整数时被咬过的次数,假设他们将具有格式化和连接并导致非常糟糕的事情...... (8认同)

小智 12

你应该总是避免使用强制转换操作符,因为它们往往会在代码中引入歧义,只能通过使用进一步的强制转换来解决,或者更糟糕的是仍然编译但是没有按照你的期望进行操作.char*()运算符会有很多问题.例如:

string s = "hello";
strcpy( s, "some more text" );
Run Code Online (Sandbox Code Playgroud)

将编译没有警告,但破坏字符串.

const版本是可能的,但由于必须(可能)复制字符串以实现它,因此它将具有不期望的隐藏成本.显式c_str()函数意味着您必须始终声明您确实打算使用const char*.

  • @Sahasranaman:如果你看一下Martin的答案(字符串内部数据不一定是连续的),你会看到需要复制的一些情况(可能的STL实现).然后在C++ 0x中也不会如此,其中连续性是必需的.我不知道任何存储不连续的STL实现,因此在现实生活中.c_str()和.data()都会将指针返回到没有副本的内部缓冲区. (2认同)

Mar*_*wis 5

字符串模板规范有意地允许字符串的"断开连接"表示,其中整个字符串内容由多个块组成.这种表示不允许轻松转换为char*.

但是,字符串模板还提供了c_str方法,以满足您的需要:使用该方法有什么问题?

  • C++ 0x将为std :: basic_string命令连续存储,但不会为charT*提供强制转换操作符.我认为这意味着虽然你的论证提供了一个合理的案例,为什么当前的字符串API不能轻易地支持隐式转换,但它并不反映标准委员会的推理. (2认同)