c_str == string与c_str == c_str的值相等

Value equality of c_str == string vs c_str == c_str

本文关键字:str string      更新时间:2023-10-16

我正在尝试比较libpqxx c_str值。

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

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

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

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

由于string s和const char*非常相似,string类定义了一个比较字符串对象和const char*指针的方法。它还定义了如何将char指针转换为字符串。然而,这实际上是一条单行道,因为它没有定义如何使用操作符或隐式转换从字符串创建const char*。这就是为什么你不能在它们上面使用strcmp

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

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

也用c_str()吧!

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

或使用std::stringoperator ==

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