Информация об изменениях

Сообщение Re[5]: Оператор приведения от 05.07.2019 10:09

Изменено 05.07.2019 10:12 rg45

Re[5]: Оператор приведения
Здравствуйте, Videoman, Вы писали:

R>>Ну это понятно почему — в цепочке присутствуют два последовательных пользовательских преобразования — оператор приведения Container и преобразующий конструктор optional, тогда как стандарт позволяет только одно. Тут нужна либо специализированная конвертирующая функция, либо явное преобразование к int:


R>>
R>>const std::optional<int> v5(int(cont5));
R>>


V>Ну вот мне пока не очень понятно . Почему в той же ситуации стандартный std::optional работает как и ожидается ? Там как-то хитро объявляется преобразующий конструктор optional(U&&), если я правильно вас понял.


Только сейчас досмотрелся, насчет двойного пользовательского преобразования это я прогнал — в твоей реализации такого конструктора просто нет

В твоем случае конструктор не подхватывается потому, что его шаблоныый параметр просто не может быть выведен (потому что тип параметра конструктора это просто завуалированный XXX::type — в принцие невыводимая конструкция) А значит и сам конструктор в принципе не может быль использован.
Re[5]: Оператор приведения
Здравствуйте, Videoman, Вы писали:

R>>Ну это понятно почему — в цепочке присутствуют два последовательных пользовательских преобразования — оператор приведения Container и преобразующий конструктор optional, тогда как стандарт позволяет только одно. Тут нужна либо специализированная конвертирующая функция, либо явное преобразование к int:


R>>
R>>const std::optional<int> v5(int(cont5));
R>>


V>Ну вот мне пока не очень понятно . Почему в той же ситуации стандартный std::optional работает как и ожидается ? Там как-то хитро объявляется преобразующий конструктор optional(U&&), если я правильно вас понял.


Только сейчас досмотрелся, насчет двойного пользовательского преобразования это я прогнал — в твоей реализации такого конструктора просто нет

В твоем случае конструктор не подхватывается потому, что его шаблоныый параметр просто не может быть выведен (потому что тип параметра конструктора это просто завуалированный XXX<YYY>::type — в принцие невыводимая конструкция) А значит и сам конструктор в принципе не может быль использован.