Явное и неявное преобразование

Я очень удивлен, что это struct, который только явно конвертируется в bool, прекрасно работает внутри if заявление:

struct A
{
    explicit operator bool(  ) const
    {
        return m_i % 2 == 0;
    }

    int m_i;
};

int main()
{
    A a{ 10 };

    if ( a ) // this is considered explicit
    {
        bool b = a; // this is considered implicit 
                    // and therefore does not compile           
    }        
    return 0;
}

Почему это так? Что является причиной дизайна в стандарте C++? Я лично нахожу более явным второе преобразование, чем первое. Чтобы сделать это еще более ясным, я ожидал, что компилятор заставит иметь следующее для обоих случаев:

int main()
{
    A a{ 10 };

    if ( (bool)a )
    {
        bool b = (bool)a;
    }        
    return 0;
}

1 ответ

Решение

§6.4 Операторы выбора [stmt.select]

  1. Значение условия, которое является выражением, является значением выражения, контекстно преобразованным в bool для операторов, отличных от switch;

§4 Стандартные преобразования [конв]

Некоторые языковые конструкции требуют преобразования выражения в логическое значение. Выражение e, появляющееся в таком контексте, называется контекстно преобразованным в bool и является правильно сформированным, если и только если объявление bool t(e); является корректным для некоторой изобретенной временной переменной t (8.5).

Таким образом, выражение условия в if должен быть контекстно конвертируемым вbool, что означает, что явные преобразования разрешены.

Этот режим, скорее всего, сделан, потому что состояние if можно оценить только до логического значения, поэтому, говоря if(cond) Вы явно заявляете, что хотите cond быть оцененным к логическому значению.

Другие вопросы по тегам