2

我正在尝试比较 libpqxxc_str值。

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

但是,如果我将 a libpqxxc_str与 astd::string进行比较strcmp,编译器会抱怨 a 的参数strcmp不能是 a std::string,但对我来说最奇怪的是:如果我比较类似的东西,如果它们具有相同的值,则result1[0][0].c_str() == some_std_string比较将,否则。return truefalse

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

4

2 回答 2

10

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

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

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

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

于 2014-05-17T03:56:09.183 回答
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)
于 2014-05-17T03:55:05.870 回答