专业新

oco*_*or0 0 c++ clang

我想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)

这应该怎么样?为什么这些例子不能打字检查?

Rem*_*eau 7

现有的placement new运算符将a void*或a std:nothrow_t作为其第二个参数.

第一个用于在现有存储器地址处分配对象.这就是为什么new (nullptr)new (i)编译,因为它们都可以转换为void*.

第二个是告诉标准分配返回NULL指针,而不是std::bad_alloc在分配失败时抛出异常.

您可以定义其他参数,但必须确保传递的任何参数都可以转换为参数类型而不是void*或者std::nothrow_t,否则将调用标准运算符而不是自定义运算符.