当调用放置新时,强制投射指向"void*"的指针是否有任何影响?

Does casting a pointer to "void*" have any effect when placement new is called?

本文关键字:void 指针 是否 影响 任何 新时 调用      更新时间:2023-10-16

我正在审查自定义容器的代码,其中一些部分创建了这样的元素:

::new( (void*)&buffer[index] ) CStoredType( other );

和一些这样做:

::new( &buffer[index] ) CStoredType( other );

所以两者都使用放置new来调用复制构造函数,通过复制其他元素来创建一个元素,但是在一种情况下,指向新元素存储的指针被原样传递,而在另一种情况下,它被强制转换为void*

这个转换到void*有任何效果吗?

可以为非空指针重载new操作符。强制类型转换确保void指针被重载。

例如

void* operator new(size_t s, env * e);

一个可编译的例子:

#include <iostream>
#include <new>
void* operator new(std::size_t, int* x)
{
    std::cout << "a side effect!" << std::endl;
    return x;
}
int main()
{
    int buffer[1];
    new ((void*)&buffer[0]) char;
    new (&buffer[0]) char;
}