否定无效

时间:2016-11-15 10:58:30

标签: c++ netbeans

我无法向您展示所有代码,因为它很大但我可以展示我正在尝试使用的东西的示例。因此,代码如下:

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() << "\n\n\n\nTESTS: "
         << 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

这种奇怪行为可能是什么原因?为什么不起作用?我应该承认,

  • 这些奇怪的是 Linux OSX 。在 Windows 中,一切都很好

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

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))

2 个答案:

答案 0 :(得分:1)

如果找不到任何内容,

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

当你否定这个内存垃圾时,最后一位将被否定,因此当你将它转换为int时,你最终得到 112:113 58:59

答案 1 :(得分:0)

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

ps:使用该死的 -Wreorder 甚至更好 -Werror -Wall