[英]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)
其中A
是D
的同義詞。 這些構造函數要求:
要求:
—如果
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.