Подтвердить что ты не робот

Почему существует неявное преобразование типа из указателей в bool в С++?

Рассмотрим класс foo с двумя конструкторами, определенными следующим образом:

class foo
{
public:
    foo(const std::string& filename) {std::cout << "ctor 1" << std::endl;}
    foo(const bool some_flag = false) {std::cout << "ctor 2" << std::endl;}
};

Создайте экземпляр класса с помощью строкового литерала и угадайте, какой конструктор вызывается?

foo a ("/path/to/file");

Вывод:

ctor 2

Я не знаю о вас, но я не считаю это самым интуитивным поведением в истории программирования. Бьюсь об заклад, есть какая-то умная причина для этого, и я хотел бы знать, что это может быть?

4b9b3361

Ответ 1

Очень часто в C писать это

void f(T* ptr) {
    if (ptr) {
        // ptr is not NULL
    }
}

Вы должны создать конструктор const char*.

Ответ 2

Вы передаете char * в конструктор foo. Это может быть неявно преобразовано в логическое (как и все указатели) или в std::string. С точки зрения компилятора первое преобразование "ближе", чем второе, поскольку оно поддерживает стандартные преобразования (то есть указатель на bool) по сравнению с предоставленными пользователем преобразованиями (конструктор std::string (char *)).

Ответ 3

Вы путаете два вопроса. Один из них заключается в том, что "blah" может быть неявно преобразован в string, а другой - в том, что const char* может быть неявно преобразован в логическое. Очень логично видеть, что компилятор переходит к неявному преобразованию, которое сводит к минимуму общее количество необходимых преобразований.