我试图比较libpqxx c_str
值。
如果我尝试直接比较它们,result1[0][0].c_str() == result2[0][0].c_str()
,例如,当它们具有相同的字符串值时,它们不会return true
。正确比较它们的唯一方法是使用strcmp
。
但是,如果我将libpqxx c_str
与std::string
与strcmp
进行比较,编译器会抱怨strcmp
的参数不能是std::string
1}},但对我来说最奇怪的是:如果我比较像result1[0][0].c_str() == some_std_string
这样的内容,那么如果它们具有相同的值,则return true
将进行比较,否则为false
。
这是为什么?这是libpqxx特有的吗?如果不是,这是标准行为吗?
答案 0 :(得分:8)
这是因为std::string
是一个类,而const char*
(c_str
返回的类型)是一个指针类型。如果指针指向相同的内存位置,则比较指针会返回true
。另一方面,类可以定义平等对它们意味着什么。
由于string
和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*
结果在编译时错误中,因为指针没有定义这种操作。
答案 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)