谈判不起作用

Negoteation not working

本文关键字:不起作用 谈判      更新时间:2023-10-16

我不能给你们看所有的代码,因为它太大了但是我可以给你们看一些我想用的例子。因此,代码如下:

namespace TestNamespace {
    struct TestBase
    {
        TestBase(std::string _id = "") : id(_id) {}
        std::string id;
    };

    struct Test : public TestBase
    {
        Test(std::string _id = "") : TestBase(_id), b1(true), b2(true) {}        
        bool b1;
        bool b2;
    };
    typedef std::list<Test> Tests;
    struct SomeStatesHolder
    { 
        SomeStatesHolder() : tests(), someAdditionalVar(true), someAdditionVar2(2222) {}
        Tests tests;
        bool someAdditionalVar;
        int someAdditionVar2;
    };
}
class WorkingClass
{
public:
    WorkingClass() : m_someStatesHolder(new TestNamespace::SomeStatesHolder()) {
        TestNamespace::Test t("id1");
        m_someStatesHolder->tests.push_back(t);
    }
    TestNamespace::Tests getTests() const { return m_someStatesHolder->tests; }
    bool getB1(const std::string& id) const {
        const auto fnd = std::find_if(m_someStatesHolder->tests.cbegin(), m_someStatesHolder->tests.cend(), [&](const TestNamespace::Test& t){
            return t.id == id;
        });
        return (fnd == m_someStatesHolder->tests.cend()) ? true : fnd->b1;
    }
        bool getB2(const std::string& id) const {
        const auto fnd = std::find_if(m_someStatesHolder->tests.cbegin(), m_someStatesHolder->tests.cend(), [&](const TestNamespace::Test& t){
            return t.id == id;
        });
        return (fnd == m_someStatesHolder->tests.cend()) ? true : fnd->b2;
    }
private:
    TestNamespace::SomeStatesHolder *m_someStatesHolder;
};

但是在项目的深处,在另一个类的函数中,我有这样的行:

qDebug() << "nnnnTESTS: "
         << workingClass.getB1("id1") << ":" << !workingClass.getB1("id1") << " "
         << workingClass.getB2("id1") << ":" << !workingClass.getB2("id1");
const auto tests = workingClass.getTests();
const std::string fid = "id1";
const auto fnd = std::find_if(tests.cbegin(), tests.cend(), [&](const TestNamespace::Test& t){
    return t.id == fid;
});
 qDebug() << "nTESTS2: "
         << fnd->b1 << ":" << !fnd->b1 << " "
         << fnd->b2 << ":" << !fnd->b2;

那几行的输出是:

TESTS:  true : true   true : true
TESTS2:  true : true   true : true

这种奇怪行为的原因是什么?为什么 !不工作?我应该承认,

  • 这个奇怪的是在LinuxOSXWindows一切都很好

  • 新的类似的测试东西工作得很好(像这样),但我在项目中的特定结构-不是。

UPD1:我还试图使函数获得这些值,结果相同。像这样的代码也不工作:

qDebug() << "Test3: " 
         << workingClass.getB1("id1") << ":" 
         << !((bool)workingClass.getB1("id1")) << ":"
         << !workingClass.getB1("id1") << ":"
         << (!(workingClass.getB1("id1")))
bool AAAAA = workingClass.getB1("id1");
qDebug() << "Test4: " 
         << AAAAA << ":" 
         << !((bool)AAAAA)) << ":"
         << !AAAAA << ":"
         << (!(AAAAA))

std::find_if将返回last,如果没有找到,它指向最后一个元素std::list之后。这是内存垃圾,您将使用return fnd->b1返回。

当你对这个内存垃圾求反时,最后一位将被求反,因此当你将其强制转换为int时,你最终得到112: 113 58: 59

我发现一个问题。在我的项目中,在同一个类(SomeStatesHolder)中,我的bool值没有在构造函数列表中初始化。

ps:使用damn -Wreorder或者更好的-Werror -Wall