Если следующая тестовая программа
#include <iostream>
class A {
public:
A() {}
explicit operator bool() const {
std::cout << __PRETTY_FUNCTION__ << std::endl;
return true;
}
// explicit operator bool() {
// std::cout << __PRETTY_FUNCTION__ << std::endl;
// return true;
// }
const operator int() const {
std::cout << __PRETTY_FUNCTION__ << std::endl;
return 1;
}
operator int() {
std::cout << __PRETTY_FUNCTION__ << std::endl;
return 1;
}
};
int main() {
A a;
if (a) {
std::cout << "bool()" << std::endl;
}
if (a + 0) {
std::cout << "int()" << std::endl;
}
}
Выполняется выход -
int A::operator int()
bool()
int A::operator int()
int()
а не
bool A::operator _Bool()
bool()
int A::operator int()
int()
что я ожидал (и что вы получите, если разобьете прокомментированные части).
Итак, вопрос в том, каковы правила, дающие преобразование в не-const-int приоритет перед преобразованием в const-bool?