В cppreference (4) конструктор преобразования описывается следующим образом:
Преобразующий конструктор. Создает вариант, содержащий альтернативный тип
T_j
, который был бы выбран разрешением перегрузки для выраженияF(std::forward<T>(t))
, если бы была перегрузка воображаемой функцииF(T_i)
для всехT_i
изTypes...
в области видимости одновременно, за исключением того, что:
- Перегрузка
F(T_i)
рассматривается только в том случае, если объявлениеT_i x[] = { std::forward<T>(t) };
допустимо для некоторой выдуманной переменнойx
;- Если
T_i
является (возможно, cv-квалифицированным)bool
,F(T_i)
рассматривается только в том случае, еслиstd:remove_cvref_t<T>
также являетсяbool
.
Меня особенно интересует второй пункт, касающийся bool
. В примере сказано, что:
std::variant<std::string, bool> y("abc"); // OK, chooses string; bool is not a candidate
Теперь я протестировал тот же код с clang 7.0.0 (godbolt), gcc.8.2 (godbolt) и VS2017. И мне интересно, почему содержащийся альтернативный тип - bool (для всех трех компиляторов), а не std::string, как описано в cppreference. Это ошибка в стандартных библиотеках всех трех компиляторов?
Я также нашел следующий документ: P0608R3 . Означает ли это, что модификации (два пункта), которые перечислены в списках предпочтений, только предложены, но еще не являются частью официального стандарта?