cppreferece中shared_ptr构造函数的定义是错误的吗?

Gar*_*ary 1 c++ c++14

在 Scott Meyers 的 Effective C++14 item 19 的第 127 页上,他说 shared_ptr 的删除器类型不是模板参数,而是在https://en.cppreference.com/w/cpp/memory/shared_ptr/ shared_ptr,(4) 构造函数将 Deleter 作为模板参数之一。

我自己在 g++10.2 中尝试过。像下面这样的东西不会编译:

auto deleter = [](foo* p) {
        std::cout << "delete ***" << std::endl;
        delete p;
};
std::shared_ptr<foo, decltype(deleter)> sp1(new foo, deleter); // error
Run Code Online (Sandbox Code Playgroud)

所以我认为 cppreference 是错误的?或者我错过了什么?

Ben*_*igt 7

你错过了一些东西。

您在 cppreference 上看到的模板参数是构造函数模板的模板参数,而不是shared_ptr类。

这里实际上总共有三个模板参数在起作用:

namespace std {
    ...
    template<typename T>
    class shared_ptr
    {
        ...
        template<typename Y, typename Deleter>
        shared_ptr( Y*, Deleter );
        ...
    };
    ...
}

template<typename T>
template<typename Y, typename Deleter>
std::shared_ptr<T>::shared_ptr( Y*, Deleter ) { ... }
Run Code Online (Sandbox Code Playgroud)