智能指针删除器和"using"名称为"pointer"关键字
Smart pointer deleter and "using" keyword with a name "pointer"
有时我看到这样的代码:
void* Create()
{
int* t{new int{10}};
return t;
}
class Deleter
{
//uncomment in order to compile
//using pointer = void*;
public:
void operator()(void* t)
{
delete t;
}
};
unique_ptr<int, Deleter> ptr{Create()};
它不编译。使用VS2013,它说:
错误:C2440:"正在初始化":无法从"初始值设定项列表"转换 到 'std::unique_ptr' 没有构造函数可以获取源代码 类型或构造函数重载分辨率不明确
但是如果我取消注释行using pointer = void*;
它就可以了!此外,如果我将别名更改为与pointer
不同的名称,则会出现相同的错误。因此,似乎拥有一个具有确切名称pointer
的using
指令至关重要。但是为什么?我找不到任何解释。
您的unique_ptr
声明T=int
.然而,std::unique_ptr
中的构造函数不接受T*
,而是pointer
参数。
此pointer
类型定义为
std::remove_reference<Deleter>::type::pointer if that type exists, otherwise T*
当你不提供Deleter::pointer
它最终会int*
,当然不能从void*
初始化(从Create
)。
[C++11: 20.7.1.2/3]
如果存在类型remove_reference<D>::type::pointer
,则unique_ptr<T, D>::pointer
应是remove_reference<D>::type::pointer
的同义词。否则unique_ptr<T, D>::pointer
应是T*
的同义词。unique_ptr<T, D>::pointer
类型应满足 NullablePointer (17.6.3.3) 的要求。
这里需要它,因为您没有operator()(int*)
- 您正在"黑客"使用它以允许使用operator()(void*)
,而不是通过让删除器假装它是void*
的删除器。
您的删除器作为一个整体是否即使在编译时仍然严格有效,我不想说。
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- C++ - "!pointer"和"pointer == nullptr"的区别?
- 谷歌模拟和覆盖关键字
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- C++函数的关键字?
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- "friend"关键字在C++中是什么意思?
- 声明C++数组(带或不带 "new" 关键字)
- 对齐和对齐的实际用例C++关键字
- 使用 "this" 关键字时的"Error: expression must have a pointer type"
- 智能指针删除器和"using"名称为"pointer"关键字