Почему существует неявное преобразование типа указателя в 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*
можно неявно преобразовать в логическое значение. Очень логично видеть, что компилятор переходит к неявному преобразованию, которое минимизирует общее количество необходимых преобразований.