【发布时间】:2020-09-10 15:41:08
【问题描述】:
这是一个语言限制的问题,请不要回答“你不应该这样做”,你是否应该不重要,重要的是你能不能 /em>。
假设我们要编写一个获取任何对象所有权的子程序,我们可以这样写,例如:
void function(void* object)
{
// store the pointer somewhere
}
auto ptr = new MyObject(params);
function(ptr);
上述方法有效,但强制用户使用new 运算符初始化他想要存储的对象。我想知道你是否可以“窃取”对象的内容,即使它是正常初始化的。
我想知道你是否可以做类似的事情:
template <typename T>
void function(T& object)
{
void* ptr = malloc(sizeof(T));
*ptr = std::move(object); // Or somehting like this
// store ptr somewhere
}
MyObject object(params);
function(object);
// object variable is now invalid
【问题讨论】:
-
您可能正在寻找
new(ptr) T(std::move(object));另请参阅:en.cppreference.com/w/cpp/language/new#Placement_new -
您需要解决的实际问题是什么?为什么你需要做这样的事情?如果您想要所有权语义,为什么不使用其中一个智能指针(如
std::unique_ptr)开始呢? -
Placement new 将允许您在已分配的内存中创建一个对象。但在这里你也可以直接说
void *ptr = new T(std:::move(object));当然,真正的诀窍是让 T 安全退出。 -
@rustyx std:: any can't store moveable only types
-
@Mat 不能;只做可移动类型
标签: c++ pointers memory void-pointers