Перегрузка оператора и неявное преобразование в bool по отношению к идиоме безопасной bool - PullRequest
3 голосов
/ 27 января 2012

Я уверен, что некоторые из моих вопросов, возможно, задавались раньше, поэтому, пожалуйста, дайте мне знать:).

Сначала пример:

#include <iostream>
struct A
{
    typedef void (A::*funcptr)();
    operator funcptr() {
        std::cout << "funcptr" << std::endl;
    }
};

int main()
{
    A a;
    if (a) {}
}

На if(a), operator funcptr() вызывается, но я не совсем уверен, что здесь происходит. Я предполагаю, что компилятор ищет преобразование из A в bool и находит operator functptr, что нормально, но как преобразование работает с указателями на функции-члены?

Кроме того, если бы я изменил operator funcptr() на operator int A::*(), это бы тоже сработало, но operator void A::* не (получаю cannot declare pointer to 'void' member), какое правило я там пропускаю? (Мои вопросы в основном касаются попыток полностью понять идиому безопасного bool)

Кроме того, если бы я объявил operator bool(), это бы имело приоритет, так каковы правила приоритета?

1 Ответ

2 голосов
/ 27 января 2012

Чтобы ответить на ваш второй вопрос, если вы используете

operator int A::*() { }

, то вы создаете оператор преобразования, который возвращает указатель на член int.Не указатель на функцию-член.Поскольку у вас не может быть членов типа void,

operator void A::*() { }

недопустимо.

...