为什么std :: string没有const char * cast(STL架构问题)?

问题描述 投票:0回答:1

我喜欢了解赞成与反对者拥有和不拥有这种演员。在包括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::stringconst char*

作为一个问题,我可以看到一些运算符重载问题,但是可以解决。

c++ c++11 casting std stdstring
1个回答
1
投票

[我喜欢知道赞成和反对的拥有和不拥有这样的演员表。

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())的需求如此罕见,以至于冗长的一点点微不足道。

© www.soinside.com 2019 - 2024. All rights reserved.