Неоднозначная конструкция варианта Boost

В документации Boost Variant говорится следующее о конструкторе, который принимает произвольный тип:

template<typename T> variant(T & operand);
  • Требования: T должен однозначно преобразовываться в один из ограниченных типов (например, T1, T2 и т. д.).

То же самое относится и к конструкторам, принимающим const T& и T&&. Поэтому я ожидаю, что следующий код не будет компилироваться:

boost::variant<std::string, bool> v = "text";

Но код компилируется, и v становится логическим, чего мне определенно не хотелось. Конечно, решение состоит в том, чтобы обернуть строковый литерал в конструктор std::string. Мой вопрос:

  1. Почему этот код компилируется?
  2. Как он выбирает тип (поскольку const char* можно преобразовать как в std::string, так и в bool)?

person petersohn    schedule 12.09.2014    source источник
comment
Конечно, в С++ 14 используйте v = "test"s;   -  person sehe    schedule 12.09.2014


Ответы (1)


Как правило, определяемые пользователем преобразования проигрывают процессу разрешения перегрузки по сравнению со стандартными преобразованиями.

Существует встроенное преобразование указателей const char в bool, которое предпочтительнее не встроенного преобразования из const char * в std::string (например, см. Неявные преобразования).

std::string, хотя и является частью стандартной библиотеки, не является встроенным типом, поэтому его конструкторы преобразования рассматриваются только после преобразования во встроенные типы.

Некоторые ссылки:

person manlio    schedule 12.09.2014