2013-08-18 2 views
4

Этот код не должен компилироваться, так почему это так? Каков принцип контекста в выражении if?Почему неявное преобразование происходит в «if expression», хотя должно быть явное преобразование

class B { 
public: 
    B() {} 
    explicit operator bool() {} 
}; 



int main(){ 
    B Bp; 
    //bool check = Bp // error 
    if (Bp){ //o.k 
     return 1; 
    } 
    return 0; 
} 

Благодаря

+2

Предполагается, что это компиляция, это контекст, который считается «явным». – Mat

+1

Вы найдете релевантные сообщения путем поиска «[C++] контекстно конвертированного bool» (без кавычек) – Mat

+2

Каковы контексты, которые считаются «явными», где я могу найти некоторую информацию об этом? – user2321876

ответ

3

Этот код очень должен компилировать. Стандарт потратил очень много усилий на то, чтобы он обеспечил.

Существует множество мест, где выражение «контекстно конвертировано в bool». В этих местах будут вызываться explicit конверсии bool, если они доступны. Одним из таких контекстных преобразований является выражение if, как в вашем случае.

Этот язык позволяет использовать explicit operator bool типы для условной проверки if(expr), но вы не можете использовать другие вещи без явного преобразования. Вы не можете передать его функции, которая принимает bool; вы не можете вернуть его из функции, которая возвращает bool и т. д.

Все контекстные преобразования являются явными выражениями в языковых функциях. Таким образом, explicit operator bool защищает вас от неявных пользовательских преобразований, но при этом допускает преобразования, определенные языком.