2016-07-19 3 views
0

Я не понимаю, что это значит typedef void (Testable::*bool_type)() const; применяется к operatorЯвляется ли этот оператор псевдонимом?

Является ли такой код

class Testable { 
    typedef void (Testable::*bool_type)() const; 

public: 

    operator bool_type() const { 
    ... 
    } 
}; 

Эквивалентен

class Testable { 

public: 

    void operator()() const { 
    ... 
    } 
}; 

?

+0

Close-voter: что вы думаете о непонятном в этом вопросе? Пожалуйста, не голосуйте из невежества. –

ответ

2
class Testable { 
    typedef void (Testable::*bool_type)() const; 

public: 

    operator bool_type() const { 
    ... 
    } 
}; 

& hellip; определяет неявное преобразование в bool_type, которое является недоступным указателем на тип члена.

Это метод C++ 03 для обеспечения неявного преобразования в bool, избегая непреднамеренных неявных преобразований, в частности для разрешения перегрузки вызова функции. Возвращаемый элемент-указатель преобразуется в bool, но не в любой тип, который можно было бы использовать для аргумента функции. Напротив, чистый результат bool преобразует, например, int, а результат void*, так как used by C++03 iostreams, соответствовал бы формальному аргументу void*.

С C++ 11 и позже вы бы вместо того, чтобы использовать explicit, как это:

explicit operator bool() const { return whatever; } 

Но лучше, определить именованный функцию преобразования, например,

auto is_empty() const -> bool { return whatever; } 

Это было в целом лучше также в C++ 03. :-)


Относительно “ такой код эквивалентен & hellip; ”, нет, это не так.

+0

Я знаю, что это за техника! Я задал еще один вопрос! –

+0

@IvanKush: А? –

+0

@ IvanKush: Я подробно остановился на ответе. Является ли это более ясным сейчас, или вы имели в виду, что вы спросили об этом в другом вопросе? –

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