Почему нельзя вывести аргументы шаблона unique_ptr? - PullRequest
0 голосов
/ 30 июня 2018

Если у вас есть доступ к выводу аргументов шаблона класса из C ++ 17, почему вы не можете вывести аргументы шаблона std :: unique_ptr? Например, это дает мне ошибку:

std::unique_ptr smp(new D);

Там написано "Список аргументов шаблона класса отсутствует".

Разве аргументы шаблона (по крайней мере, тип указателя) не должны выводиться?

Смотрите это :

любое объявление, которое указывает инициализацию переменной и шаблон переменной

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Я не собираюсь повторять обоснование в @ замечательном ответе Натана Оливера , я просто собираюсь упомянуть как этого, механика, и это то, что я думаю вы тоже после. Вы правы в том, что если конструктор unique_ptr выглядел просто как ...

explicit unique_ptr( T* ) noexcept;

... можно вывести T. Сгенерированное компилятором руководство по выводам будет работать просто отлично. И это было бы проблемой, как показывает Натан. Но конструктор указан так ...

explicit unique_ptr( pointer p ) noexcept;

... где псевдоним pointer указан следующим образом:

pointer: std::remove_reference<Deleter>::type::pointer если что тип существует, в противном случае T*. Должен удовлетворять NullablePointer .

Эта спецификация по сути означает, что pointer должен быть псевдонимом __some_meta_function<T>::type. Все, что слева от ::type, представляет собой не выводимый контекст, который предотвращает вычитание T из pointer. Таким образом, такие руководства по выводам могут быть ошибочными, даже если pointer должно быть всегда T*. Просто сделав его не выводимым контекстом, вы предотвратите жизнеспособность любого руководства по выводам, созданного этим конструктором.

0 голосов
/ 30 июня 2018

Давайте посмотрим на new int и new int[10]. Оба из них возвращают int*. Невозможно определить, должны ли вы иметь unique_ptr<int> или unique_ptr<int[]>. Этого права здесь достаточно, чтобы не предоставить какого-либо руководства по удержанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...