为什么 C++11 中 std::string 没有 const char* 强制转换运算符?

Ant*_*cus 5 c++ stl stdstring c++11

在C++03中,对于std::stringc_str()data()方法有不同的行为。

第一个返回一个以空结尾的字符数组,最后一个的管理完全依赖于实现。事实上,c_str() 可以返回指向另一个预分配缓冲区的指针,该缓冲区始终包含一个以 null 结尾的字符串,但这不是强制性的。然而,复杂性必须是恒定的。

第二个只是返回指向 的内部缓冲区的指针std::string,该缓冲区可以是空终止的,也可以不是。

因此,在 C++03 中,您可能会猜测强制转换运算符 toconst char*不是一个好主意。事实上,大多数时候,预期的行为是有一个以 null 结尾的 C 风格字符串,但是,由于 的实现c_str()可能会有所不同,因此强制转换运算符后面可能存在隐藏的开销。在另一种情况下,如果强制转换运算符返回与 相同的结果,可能会带来混乱data()

但是,对于 C++11,c_str()data()具有相同的行为。c_str()返回指向对象内部缓冲区的指针std::string。强制转换运算符 toconst char*不再含糊不清。std::string为什么C++11 中的类中没有此方法?

谢谢 !

Joh*_*ing 3

你的问题从根本上来说是关于课程设计背后的哲学string。我只能发表意见。

为什么应该string有一个强制转换运算符const char*?强制转换运算符是其他操作的语法糖,只有在特殊情况下才真正需要。事实上,它们从来都不需要——你总是可以用另一种方式实现同​​样的目标。

string已经提供了与旧的 C 风格接口交互的方法,通过c_strdata。在组合中添加强制转换运算符不会增加功能,而且会增加类的复杂性。此外,使用强制转换运算符在语义上始终是模糊的。在调用站点代码中,诸如 with 之类的强制转换static_cast <const char*>通常被认为是编译时操作。通过运行时代码执行此转换,您的代码就会变得模糊。还不太清楚。由于期望和现实并不相同,因此与编译时等效项相比,滥用此运行时转换要容易得多。

我认为在不需要的地方不应该有隐式转换运算符;但它不在这里。