2016-01-13 65 views
3

我有,我已經明確地超負荷運營商布爾像這樣一類: -object.operator bool()和(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

FWIW,在C++中'fooobj.operator bool()'和'(bool)(fooobj)'沒有區別。我不知道他們在gdb中有什麼不同。 –

+0

@RSahu這正是我的理解。但是,它絕對不會以這種方式工作。 – owagh

+0

[沒有區別](https://ideone.com/V88alD)。你的問題似乎更多的是關於GDB的操作而不是關於C++的操作。 –

回答

1

我只是跑了一些快速測試,它似乎是gdb不處理用鏗鏘編譯的代碼。下面是一個測試程序:

#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; 
} 

當二進制運行時,如預期的輸出,即(布爾)f是相同f.operator布爾(),而不管編譯器。但是,如果gdb與使用g ++的代碼構建一起使用,則p命令的行爲正確。然而,當GDB上運行的代碼使用鐺++構建的,我得到:

(gdb) print f.operator bool() 
Couldn't find method Foo::operatorbool 
(gdb) 

我在Ubuntu 14.04運行鐺v 3.4,GCC 4.8.4 v。

事實上,一個快速搜索顯示:Is it possible to debug a gcc-compiled program using lldb, or debug a clang-compiled program using gdb?。所以,我試了lldb,它按預期工作。這與我在調查時添加的評論是一致的。

+0

爲了完整性,你可以嘗試安裝'lldb',看看它的價格? –

+0

寫得不錯的答案。公認! – owagh

相關問題