繁体   English   中英

用删除器初始化std :: unique_ptr

[英]Initializing std::unique_ptr with deleter

这是我的代码:

class dummy{
    public:
    int x;
dummy(int y):x(y){
}

};


const auto& zDeleter = [](dummy * obj){
    std::cout<<"this is called"<<std::endl;
    delete obj;
};


std::unique_ptr<dummy,decltype(zDeleter)> funct(){
    std::unique_ptr<dummy,decltype(zDeleter)> temp(new dummy(10),zDeleter);

    return temp;


}

int main(){

    std::unique_ptr<dummy,decltype(zDeleter)> get(nullptr,zDeleter);

    return 0;   

}

我想发生的是使std::unique_ptr<dummy,decltype(zDeleter)> get初始化并使用它来获取funct()的返回值。 get = funct(); 给我错误。

我试着做std::unique_ptr<dummy,decltype(zDeleter)> get; 但是我得到tuple “递归必需”错误。 如果我使用std::unique_ptr<dummy,decltype(zDeleter)> get(nullptr,zDeleter);编译,我不会出错std::unique_ptr<dummy,decltype(zDeleter)> get(nullptr,zDeleter); 但它不会让我收到funct()的返回值。 奇怪的问题,但我这样做是出于研究目的。

额外的问题:如果我将使用auto&& zDeleter而不是auto zDeleterconst auto& zDeleter怎么会出现长错误?

decltype(zDeleter)是常量。 std::unique_ptr<dummy,decltype(zDeleter)> get; 因为它是const成员,所以您无法为删除器提供一个值,因此无法使用。

并且因为您的deleter函数具有const修饰符,所以您不能使用赋值。

你为什么不这样做:

std::unique_ptr<dummy,decltype(zDeleter)> get = funct();

或者如果您用std::function<void(dummy*)>替换delctype(zDeleter) ,它将起作用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM