Не усложняй дела. Просто сделайте
observer_ptr<const int> p{&i};
И все в порядке.
Вы также можете сделать это в соответствии с spec :
observer_ptr p{&std::as_const(i)};
, но GCC иКажется, что Clang отличается от спецификации здесь. Реализация использует квалифицированное имя для конструктора (element_type*)
, поэтому блокирует вычитание аргумента шаблона класса.
Так же, как std::make_pair
, make_observer
существует, потому что основы библиотеки 2 TS созданы в предварительном порядке. C ++ 17 эпоха. Вывод аргументов шаблона класса в то время не был чем-то особенным. В настоящее время нам редко нужна отдельная функция make, такая как std::make_pair
(контрпример: справочные оболочки, см. Полезность std::make_pair
и std::make_tuple
в C ++ 1z ), и аналогично нам редко нужна make_observer
.
Поэтому нет смысла говорить о «каноническом» способе использования функции до C ++ 17, такой как observer_ptr
в C ++ 17. Конечно, мы можем использовать вывод аргумента шаблона класса, если он действительно работает. Это просто не учитывается при проектировании observer_ptr
.