c_str == string vs c_str == c_str的值相等

时间:2014-05-17 03:52:58

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

我试图比较libpqxx c_str值。

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

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

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

2 个答案:

答案 0 :(得分:8)

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

由于stringconst 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*结果在编译时错误中,因为指针没有定义这种操作。

答案 1 :(得分: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)