簡體   English   中英

std :: unique_ptr的自定義刪除程序規范

[英]Custom deleter specifications for std::unique_ptr

我正在閱讀Josuttis的C ++標准庫。 在以下示例中,我找不到(2)和(3)注釋的原因:

D d;  //instance of the deleter type(1)
unique_ptr<int,D> p1(new int, D()); //D must be  MoveConstructible(2)
unique_ptr<int,D> p2(new int, d);  //D must be CopyConstructible(3)

在這種情況下,發表評論(2)和(3)的原因是什么?

std::unique_ptr自定義刪除程序的規范是什么?

對於情況2),您使用的是臨時文件,因此編譯器可以移動它。 在情況3)中,您給出的對象無法移動,因此編譯器將需要進行復制。

該規范在cppreference (構造函數3-4)上有准確的描述,直接來自C ++標准部分[unique.ptr.single.ctor]。 由於您的D是非引用類型,因此簽名如下:

 unique_ptr(pointer p, const A& d); // your (3) unique_ptr(pointer p, A&& d); // your (2) 

其中AD的同義詞。 這些構造函數要求:

要求:

—如果D不是左值引用類型,則

  • 如果d是左值或const右值則這對的第一構造函數將被選擇。 D應滿足CopyConstructible的要求(表21),並且D的副本構造函數不得引發異常。 unique_ptr將保存d的副本。
  • 否則, d是非const右值和該對中的第二構造函數將被選擇。 D應滿足MoveConstructible的要求(表20),並且D的move構造函數不得引發異常。 unique_ptr將保存從d構造的值移動。

第一個要點描述您的情況(3),第二個要點描述您的情況(2)。

暫無
暫無

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

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