Проблемы с порядком разрешения конструкторов

Рассмотрим следующие конструкторы для T:

struct T {
    T(const bool) { std::cout << "T(const bool)" << endl; }
    T(const std::string&) { std::cout << "T(const std::string&)" << endl; }
};

T t("");
  1. Почему T (const bool) имеют приоритет над T (const std :: string &) при построении t?
  2. Поскольку вышеуказанный приоритет может вызвать путаницу у пользователей, ожидающих вызова T (const std :: string &) , что я могу сделать, чтобы получить T (const std :: string &) неявно вызывается при передаче строковых литералов в конструктор T. На данный момент я нашел единственное решение, которое я нашел, - это добавить еще один конструктор, который имеет наивысший приоритет:

     T (const char * s)
     {
      std :: cout << "T (const char *)" << endl;
      * this = std :: string (s);
     }
     
  3. Помимо приведенного выше решения, объявление явного T (const bool) во избежание путаницы не решает вышеуказанную проблему: в этом случае, хотя T t = "" теперь запрещено, почему форма T t ("") все еще разрешена и вызывает T (const bool) ?

7
задан James McNellis 18 August 2011 в 05:40
поделиться