我想new在C++中实现我自己的带有分配器的版本.我可以这样做:
template <class T>
void *operator new(std::size_t size, project::specialized_allocator<T> &a) {
return a.allocate(size);
}
Run Code Online (Sandbox Code Playgroud)
然后我可以使用这个分配器:
project::specialized_allocator<int> A;
int *i = new (A) int;
Run Code Online (Sandbox Code Playgroud)
不过,我也可以打电话:
int *i = new (nullptr) int;
Run Code Online (Sandbox Code Playgroud)
而Clang并没有抱怨,而是编译代码.我不确定这应该做什么以及为什么它没有使用类型错误编译失败.nullptr不是project::specialized_allocator<T> &.
我得到了类似的怪异:
int *i = new (i) int;
Run Code Online (Sandbox Code Playgroud)
这应该怎么样?为什么这些例子不能打字检查?
现有的placement new运算符将a void*或a std:nothrow_t作为其第二个参数.
第一个用于在现有存储器地址处分配对象.这就是为什么new (nullptr)和new (i)编译,因为它们都可以转换为void*.
第二个是告诉标准分配返回NULL指针,而不是std::bad_alloc在分配失败时抛出异常.
您可以定义其他参数,但必须确保传递的任何参数都可以转换为参数类型而不是void*或者std::nothrow_t,否则将调用标准运算符而不是自定义运算符.