2009年10月17日星期六

为什么STL中的string没有实现operator const char*

std::string(我们就默认是std::basic_string吧)没有直接实现operator const char*,而是用一个c_str()函数来实现这个转换,我过去一直对STL这个舍近求远的做法不大理解,不过最近碰到一个应用场景,说明了这个做法的合理性。 

Java代码  收藏代码
  1. const char* foo()  
  2. {  
  3.     .......  
  4.     // 这里正确的写法是str.size()?str.c_str():0;  
  5.     return str.size()?str:0;  
  6. }  


如果std::string实现了operator const char*,在这个三元运算符内就会产生一个微妙的问题,就是编译器在进行计算的时候,并不是选择自动对str进行const char*的转型操作,而是选择了对所有参与运算的变量进行类型提升,这里类型提升怎么样提?这里自然是把做为构造函数的参数,来构造一个临时的string对象,在效率上用户可能无法接受,在某些特殊的场景还可能引起程序的错误。不明显的隐式转换,这只是一个例子,无数的陷井还程序中,让后期的调试苦不堪言。 

如果对象是用户自定义,最好选择尽量在构造函数前加explicit,来禁掉通过隐式转换来不明不白地调用拷贝构造函数,创建临时对象。我看了basic_string的定义,构造函数没有加explicit关键字,那么就选择了禁掉operator const char*。