我无法向您展示所有代码,因为它很大但我可以展示我正在尝试使用的东西的示例。因此,代码如下:
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))
答案 0 :(得分:1)
std::find_if
将返回last
,指向最后一个元素std::list
。这是内存垃圾,您将使用return fnd->b1
返回。
当你否定这个内存垃圾时,最后一位将被否定,因此当你将它转换为int时,你最终得到 112:113 58:59 。
答案 1 :(得分:0)
我发现了一个问题。在同一个类(SomeStatesHolder)的项目中,我的bool值没有在构造函数列表中初始化。
ps:使用该死的 -Wreorder 甚至更好 -Werror -Wall