【问题标题】:Value equality of c_str == string vs c_str == c_strc_str == string vs c_str == c_str 的值相等
【发布时间】:2014-05-17 03:52:58
【问题描述】:

我正在尝试比较 libpqxx c_str 的值。

如果我尝试直接比较它们,例如result1[0][0].c_str() == result2[0][0].c_str(),当它们具有相同的字符串值时,它们不会return true。正确比较它们的唯一方法是使用strcmp

但是,如果我将 libpqxx c_strstd::stringstrcmp 进行比较,编译器会抱怨 strcmp 的参数不能是 std::string,但对我来说最奇怪的是:如果我比较像result1[0][0].c_str() == some_std_string 这样的东西,如果它们具有相同的值,则比较将return true,否则比较false

这是为什么?这是 libpqxx 特有的东西吗?如果不是,这是标准行为吗?

【问题讨论】:

  • result1[0][0].c_str() == result2[0][0].c_str() 是的,这是两个不同的指针。
  • @Gracchus,值得注意的是,即使 string 没有用于 char 指针的 operator==,仅仅一个事实 const char* 可以隐式地变成 string 意味着无论如何它都会起作用。看到不存在operator==,编译器将寻找一种方法将const char* 隐式转换为string,并找到接受单个const char* 的非explicit 字符串构造函数,并使用它。

标签: c++ string equality libpqxx c-str


【解决方案1】:

这是因为std::string 是一个类,而const char*c_str 返回的类型)是一个指针类型。如果指针指向相同的内存位置,则比较指针返回true。另一方面,类可以定义相等对它们的意义。

由于strings 和const char* 非常相似,string 类定义了一种将字符串对象与const char* 指针进行比较的方法。它还定义了如何将char 指针转换为字符串。然而,这本质上是一条单向街道,因为它没有定义如何仅使用运算符或隐式转换从字符串创建const char*。这就是为什么你不能对它们使用strcmp

Strcmp 是 C 标准库中的一个函数。 C 没有类,类型不能像 C++ 类那样定义基本行为。因此,C定义了一堆函数来处理char指针,而且只处理char指针。

char 指针和字符串之间的这种不一致并不仅限于相等。例如,std::string 支持与 + 运算符的连接:这意味着 string + string 有效,const char* + string 有效,string + const char* 有效,但 const char* + const char* 导致编译时错误,因为指针不定义这种操作。

【讨论】:

    【解决方案2】:

    也可以使用c_str()

    if (strcmp(result1[0][0].c_str(), some_std_string.c_str()) == 0)
    {
        ...
    

    或使用operator ==std::string

    if (result1[0][0].c_str() == some_std_string)
    

    【讨论】:

    • 感谢您给我一个美观一致的方法!
    • @Gracchus 如果对您有帮助,请选择我的答案>ostring 不支持operator == 吗?多么糟糕......
    • 你至少应该在第二种情况下添加一些关于隐式强制转换(通过 ctr)的词
    • 隐式转换?在哪里??
    • 你的意思是...... result1[0][0].c_str() 将被隐式转换?不,std::string不仅有bool operator ==(const std::string&, const std::string&),还有bool operator ==(const char*, const std::string&)bool operator ==(const std::string&, const char*)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2023-01-11
    • 2012-04-17
    • 1970-01-01
    • 2019-03-08
    • 2014-07-15
    相关资源
    最近更新 更多