Ответ 1
Очень часто в C писать это
void f(T* ptr) {
if (ptr) {
// ptr is not NULL
}
}
Вы должны создать конструктор const char*
.
Рассмотрим класс 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
Я не знаю о вас, но я не считаю это самым интуитивным поведением в истории программирования. Бьюсь об заклад, есть какая-то умная причина для этого, и я хотел бы знать, что это может быть?
Очень часто в C писать это
void f(T* ptr) {
if (ptr) {
// ptr is not NULL
}
}
Вы должны создать конструктор const char*
.
Вы передаете char * в конструктор foo. Это может быть неявно преобразовано в логическое (как и все указатели) или в std::string. С точки зрения компилятора первое преобразование "ближе", чем второе, поскольку оно поддерживает стандартные преобразования (то есть указатель на bool) по сравнению с предоставленными пользователем преобразованиями (конструктор std::string (char *)).
Вы путаете два вопроса. Один из них заключается в том, что "blah"
может быть неявно преобразован в string
, а другой - в том, что const char*
может быть неявно преобразован в логическое. Очень логично видеть, что компилятор переходит к неявному преобразованию, которое сводит к минимуму общее количество необходимых преобразований.