std :: string ==运算符不工作

时间:2010-05-11 15:47:25

标签: c++ string stl

我在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构建。

有什么想法吗?它对我来说看起来非常有用。

2 个答案:

答案 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