我有一个类,我已经明确地重载了操作符bool: -
class Foo {
explicit operator bool() {
// return_something_here
}
};
但是,当我在gdb中运行以下两个时,我得到: -
gdb) p fooobj.operator bool()
$7 = true
gdb) p (bool)(fooobj)
$8 = false
两次调用之间的区别是什么?为什么它们会返回不同的东西?
编辑: - 我正在使用clang编译器。
注意: - 第二个值(false)是我想要使用第一个语法返回的正确值。我使用的是codegen,所以如果有人好奇我为什么不使用第二种语法,我就无法完全控制c ++的生成。
即使在这种情况下,两者之间的差异仍然是一个悬而未决的问题。
答案 0 :(得分:1)
我刚刚运行了一些快速测试,看起来gdb不能处理用clang编译的代码。这是一个测试程序:
#include <iostream>
using namespace std;
class Foo {
public:
Foo() : m_Int(0) {}
operator bool() {
return true; // also tried false here
}
private:
int m_Int;
};
int main()
{
Foo f;
if (f.operator bool()) cout << "operator bool is true.\n";
if ((bool)f) cout << "(bool)f is true.\n";
return 0;
}
运行二进制文件时,输出是预期的,即(bool)f与f.operator bool()相同,无论编译器如何。但是,如果gdb与使用g ++的代码构建一起使用,则p
命令的行为正确。然而,当gdb运行在使用clang ++构建的代码上时,我得到:
(gdb) print f.operator bool()
Couldn't find method Foo::operatorbool
(gdb)
我在Ubuntu 14.04上运行clang v.3.4,gcc v.4.8.4。
事实上,快速搜索显示了这一点:Is it possible to debug a gcc-compiled program using lldb, or debug a clang-compiled program using gdb?。所以,我尝试lldb
,它按预期工作。这与我正在调查时添加的评论一致。