- const char* foo()
- {
- .......
- // 这里正确的写法是str.size()?str.c_str():0;
- return str.size()?str:0;
- }
如果std::string实现了operator const char*,在这个三元运算符内就会产生一个微妙的问题,就是编译器在进行计算的时候,并不是选择自动对str进行const char*的转型操作,而是选择了对所有参与运算的变量进行类型提升,这里类型提升怎么样提?这里自然是把做为构造函数的参数,来构造一个临时的string对象,在效率上用户可能无法接受,在某些特殊的场景还可能引起程序的错误。不明显的隐式转换,这只是一个例子,无数的陷井还程序中,让后期的调试苦不堪言。
如果对象是用户自定义,最好选择尽量在构造函数前加explicit,来禁掉通过隐式转换来不明不白地调用拷贝构造函数,创建临时对象。我看了basic_string的定义,构造函数没有加explicit关键字,那么就选择了禁掉operator const char*。