簡體   English   中英

是否可以將已經初始化的變量變成 void*?

[英]Is it possible to turn an already initialized variable into a void*?

這是一個語言限制的問題,請不要回答“你不應該這樣做”,你是否應該不重要,重要的是你能不能

假設我們要編寫一個獲得 ANY object 所有權的子程序,我們可以這樣寫,例如:

void function(void* object)
{
   // store the pointer somewhere
}

auto ptr = new MyObject(params);
function(ptr);

上述方法有效,但強制用戶使用new運算符初始化他希望存儲的對象。 我想知道您是否可以“竊取” object 的內容,即使它已正常初始化。

我想知道你是否可以做這樣的事情:

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

假設我們要編寫一個獲得任何 object 所有權的子程序。

單獨使用指向 void 的指針肯定是不可能的,因為所有權意味着負責刪除動態 object,並且不可能通過 void 指針刪除 object。

它可以通過使用刪除器 function object 來實現。 無需為此編寫包裝器 class ,因為標准庫已涵蓋1

我想知道你是否可以做這樣的事情:

 void* ptr = malloc(sizeof(T)); *ptr = std::move(object);

不完全是這樣,因為你不能通過指向 void 的指針間接,此外,你還沒有首先在那里創建 object,所以沒有什么可以分配的。

從左值引用參數轉移也是一個壞主意。

您似乎想要做的是創建一個動態 object,它是參數 object 的副本(通過移動)。 以下是如何執行此操作的示例:

template <typename T>
void function(T&& object)
{
    auto ptr = std::make_unique<T>(std::move(object));

您可以像這樣獲得指向 void 的指針:

void* void_ptr = ptr.get();

1要對任何類型的 object 進行類型擦除(可以通過指向 void 的指針來實現),但也能夠擁有 object(與指向 void 的指針不同),標准庫中有一種類型: std::any .

您當然可以從非動態分配的事物轉移,並且可以轉移到動態分配的事物。

但是,這僅在“移動”對您的類型有意義且有價值的情況下才有用。 否則,您將無法復制數據。

請記住: std::move實際上並沒有在轉移或改變其生命周期的意義上移動對象; 它只允許編譯器選擇構造函數和賦值運算符重載,這些重載可能執行一些間接 state 的廉價傳輸,以避免深度復制的成本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM