Почему в C ++ происходит неявное преобразование типов из указателей в bool? - PullRequest
14 голосов
/ 06 ноября 2010

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

Выход:

ктор 2

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

Ответы [ 3 ]

10 голосов
/ 06 ноября 2010

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

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

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

3 голосов
/ 06 ноября 2010

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

0 голосов
/ 06 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...