2014-09-12 3 views
8

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

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

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

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

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

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

Конечно, в C++ 14 использования 'v = "тест" s;' – sehe

ответ

2

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

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

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

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