我喜欢了解赞成与反对者拥有和不拥有这种演员。在包括Stack Overflow在内的多个地方,我可以看到const char*
强制转换被认为是一个坏主意,但我不确定为什么?
缺少(const char*)
并强制始终使用c_str()
强制转换会在编写通用例程和模板时产生一些问题。
void CheckStr(const char* s)
{
}
int main()
{
std::string s = "Hello World!";
// all below will not compile with
// Error: No suitable conversion function from "std::string" to "const char *" exists!
//CheckStr(s);
//CheckStr((const char*)s);
// strlen(s);
// the only way that works
CheckStr(s.c_str());
size_t n = strlen(s.c_str());
return 0;
}
例如,如果我有大量接受const char*
作为输入的文本处理功能,并且我希望每次必须使用std::string
时都可以使用c_str()
。但是通过这种方式,如果不付出额外的努力,就无法将模板函数同时用于std::string
和const char*
。
作为一个问题,我可以看到一些运算符重载问题,但是可以解决。
[我喜欢知道赞成和反对的拥有和不拥有这样的演员表。
Con:隐式行为常常使程序员感到惊讶。
例如,您对以下程序有什么期望?
std::string some_string = "";
if (some_string)
std::cout << "true";
else
std::cout << "false";
由于std::string
不能转换为bool
,程序是否格式错误?结果应该取决于字符串的内容吗?大多数程序员会有相同的期望吗?
使用当前的std::string
,由于没有这样的转换,因此上述内容将格式错误。很好无论程序员期望什么,他们在尝试编译时都会发现自己的误解。
如果std::string
具有到指针的转换,那么还将存在一个转换序列,以通过转换为指针进行布尔转换。上面的程序格式正确。并且程序将打印true
,而不管字符串的内容如何,因为c_str
永远不会为null。如果程序员反而希望空字符串为假,该怎么办?如果他们从不打算有任何行为,而是在那儿偶然使用了字符串怎么办?
以下程序如何?
std::string some_string = "";
std::cout << some_string + 42;
您是否希望程序格式错误,因为没有用于字符串和int
的此类运算符?
如果存在向char*
的隐式转换,则以上内容将具有未定义的行为,因为它执行指针算术并访问其边界之外的字符串缓冲区。
// all below will not compile with
strlen(s);
这实际上是一件好事。大多数情况下,您不想呼叫strlen(s)
。通常,您应该使用s.size()
,因为它速度更快。 strlen(s.c_str())
的需求如此罕见,以至于冗长的一点点微不足道。