我在windows和linux上多年来一直使用std :: string的==运算符。现在我在linux上编译我的一个库,它使用==重。在linux上,以下函数失败,因为即使字符串相等(=区分大小写相等)<= p>,==也会返回false
const Data* DataBase::getDataByName( const std::string& name ) const
{
for ( unsigned int i = 0 ; i < m_dataList.getNum() ; i++ )
{
if ( m_dataList.get(i)->getName() == name )
{
return m_dataList.get(i);
}
}
return NULL;
}
getName()方法声明如下
virtual const std::string& getName() const;
我正在使用gcc 4.4.1和libstdc ++ 44-4.4.1构建。
有什么想法吗?它对我来说看起来非常有用。
保
答案 0 :(得分:2)
我几乎看不到您的代码有任何问题。似乎这个bug的起源在其他地方。
我猜你会返回一个局部变量的引用。
参见我的例子:
#include <iostream>
using std::string;
const string& getString()
{
string text("abc");
return text;
}
int main() {
string text("abc");
std::cout << (getString() == text ? "True" : "False") << "\n";
return 0;
};
我机器上的输出:
False
但是我在某些环境中遇到了例外输出。它是无效的代码,但未定义行为。显然,它经常正常工作。
注意编译警告,例如:
a.cpp:7: warning: reference to local variable ‘text’ returned
您也可以尝试使用选项“-Wall”编译代码,并查看警告是否表明存在任何实际问题。
答案 1 :(得分:1)
(在黑暗中拍摄,因为我没有看到您的代码示例有任何问题)
也许您的等值运算符在其他地方被重载?除了单步执行代码之外,另一种方法是显式调用您尝试从std ::到达的相等运算符。例如:
#include <iostream>
int main(void)
{
const std::string lhs = "hello";
const std::string rhs = "hello";
if (lhs == rhs)
{
std::cout << "Matches" << std::endl;
}
if (std::operator==( lhs, rhs ) == true)
{
std::cout << "Matches 2" << std::endl;
}
return 0;
}
应输出:
Matches
Matches 2