Пространства имён
Варианты
Действия

правила вывода для std::shared_ptr

Материал из cppreference.com
< cpp‎ | memory‎ | shared ptr
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
 
Определено в заголовочном файле <memory>
template< class T >
shared_ptr( std::weak_ptr<T> ) -> shared_ptr<T>;
(1) (начиная с C++17)
template< class T, class D >
shared_ptr( std::unique_ptr<T, D> ) -> shared_ptr<T>;
(2) (начиная с C++17)

Эти правила вывода предоставляются для std::shared_ptr для учёта пограничных случаев, пропущенных неявными правилами вывода.

Обратите внимание, что нет вывода аргумента шаблона класса из типов указателей, потому что невозможно отличить указатели, полученные из форм new для массивов и не для массивов.

[править] Пример

#include <memory>
 
int main()
{
    auto p = std::make_shared<int>(42);
    std::weak_ptr w{p};    // в этом случае используется явное правило вывода
    std::shared_ptr p2{w}; // в этом случае используется явное правило вывода
}