中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中如何使用lambda代替unique_ptr的Deleter

發布時間:2021-08-09 11:59:26 來源:億速云 閱讀:192 作者:小新 欄目:編程語言

這篇文章主要介紹C++中如何使用lambda代替unique_ptr的Deleter,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

代碼

#include <iostream>
#include <cstdlib>
#include <memory>
#include <string>
#include <functional>
using namespace std;
class go
{
public:
  go() {}
  ~go()
  {
    cout << "go die.\n";
  }
};
auto d = [] ( go * gp )
{
  delete gp;
  cout << "deletor done.\n";
};
class go_de
{
public:
  void operator() ( go* g )
  {
    d ( g );
  }
};
int main()
{
  {
    unique_ptr < go, go_de > b{ new go{} };//1
  }
  {
    //unique_ptr < go, decltype (d) > b{ new go{}}; complie error //2
    unique_ptr < go, decltype (d) > a{ new go{}, d };//3
  }
  {
    unique_ptr < go, function<void(go*) > > a{ new go{}, d };//4
    //i.e. unique_ptr < go, function<void(go*) > > a{ new go{}, [](go*gp) {delete gp;cout << "deletor done.\n"; }};
  }
  system ( "pause" );
  return 0;
}

描述

一般的,需要給一個模板的Concept參數時,都會像代碼1的實現一樣傳入一個實現了該Concept的類型,例如go_de就實現了unique_ptr 的模板參數Deletor。

今天想嘗試一下使用lambda表達式的類型作為模板參數傳入,發現不行。原因在于

c++14 draft n4269

5.1.2 Lambda expressions

20 The closure type associated with a lambda-expression has no default constructor and a deleted copy assignment operator. It has a defaulted copy constructor and a defaulted move constructor (12.8). [ Note: These special member functions are implicitly defined as usual, and might therefore be defined as deleted. end note ]

意思就是 lambda 表達式沒有默認的構造函數,operator=也被置為deleted。只有一個默認的復制構造函數和move構造函數。很顯然,unique_ptr 的實現肯定是用到了Deletor Concept的默認構造函數的。所以編譯不通過。這個在
unique_ptr構造函數頁寫的很清楚。

2) Constructs a std::unique_ptr which owns p, initializing the stored pointer with p and value-initializing the stored deleter. Requires that Deleter is DefaultConstructible and that construction does not throw an exception.2) Constructs a std::unique_ptr which owns p, initializing the stored pointer with p and value-initializing the stored deleter. Requires that Deleter is DefaultConstructible and that construction does not throw an exception.

設想unique_ptr( pointer p, d1 );構造函數不存在,那Lambda類型就沒法作為Concept傳入了。

總結

  • 想用Lambda表達式的類型作為Concept,使用類型推導關鍵字decltype

  • Lambda的類型沒有default constructor、copy assignment operator.

  • 寫C++庫的時候,如果用到模板和Concept技術,要考慮添加Concept對象做參數的類型的構造函數從而才能不限制Lambda表達式類型作為Concept傳入。

畢竟,C++語言設計的原則是盡量不限制C++語言的用戶的編程方式。

以上是“C++中如何使用lambda代替unique_ptr的Deleter”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

奉化市| 平塘县| 枣庄市| 永修县| 金昌市| 台中市| 山丹县| 邵东县| 全州县| 余干县| 许昌县| 闻喜县| 唐海县| 冷水江市| 邓州市| 桃园市| 万源市| 含山县| 皮山县| 新沂市| 红河县| 苗栗县| 洞头县| 瑞安市| 徐闻县| 吴堡县| 银川市| 遵化市| 时尚| 关岭| 潼关县| 扶绥县| 黄冈市| 颍上县| 高碑店市| 五大连池市| 特克斯县| 江北区| 奉化市| 大方县| 临泉县|