在 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 是错误的?或者我错过了什么?
你错过了一些东西。
您在 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)
| 归档时间: |
|
| 查看次数: |
63 次 |
| 最近记录: |