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

рассмотрим класс 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

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

3 ответов


Это очень распространено в C, чтобы написать это

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

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


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


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