object.operator bool()和(bool)对象有什么区别?

时间:2016-01-13 21:21:06

标签: c++ c++11 gdb clang++ conversion-operator

我有一个类,我已经明确地重载了​​操作符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 ++的生成。

即使在这种情况下,两者之间的差异仍然是一个悬而未决的问题。

1 个答案:

答案 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,它按预期工作。这与我正在调查时添加的评论一致。