2016-01-13 3 views
3

У меня есть класс, для которого я перегрузил BOOL оператор явно, как это: -В чем разница между объектами object.operator bool() и (bool)?

class Foo { 
    explicit operator bool() { 
    // return_something_here 
    } 
}; 

Однако, когда я бегу в БГД следующие два я получаю: -

gdb) p fooobj.operator bool() 
$7 = true 
gdb) p (bool)(fooobj) 
$8 = false 

В чем разница между двумя вызовами и почему они возвращают разные вещи?

Редактировать: - Я использую компилятор clang.

Примечание: - Второе значение (false) - это правильное значение, которое я хочу вернуть с помощью первого синтаксиса. Я использую codegen, поэтому у меня нет полного контроля над тем, что C++ генерируется, если кому-то интересно, почему я не просто использую второй синтаксис.

Даже в этом случае разница между ними все равно осталась бы без ответа.

+1

FWIW, нет разницы между 'fooobj.operator bool()' и '(bool) (fooobj)' в C++. Я не знаю, как они отличаются в gdb. –

+0

@RSahu Это именно то, что я понял. Однако, похоже, это не работает так. – owagh

+0

Существует [без разницы] (https://ideone.com/V88alD). Ваш вопрос, похоже, больше связан с работой GDB, чем с C++. –

ответ

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 запускается на код построен с использованием лязг ++, я получаю:

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

Я бегу лязг V 3.4, GCC V 4.8.4 на Ubuntu 14.04...

Фактически, быстрый поиск показал это: Is it possible to debug a gcc-compiled program using lldb, or debug a clang-compiled program using gdb?. Итак, я пробовал lldb, и он работал, как ожидалось. Это согласуется с комментарием, который был добавлен при расследовании.

+0

для полноты, вы также можете попробовать установить 'lldb' и посмотреть, как это работает? –

+0

Хорошо написанный ответ. Принято! – owagh

 Смежные вопросы

  • Нет связанных вопросов^_^