用删除器初始化std :: unique_ptr

时间:2015-06-22 05:15:44

标签: c++ c++11

这是我的代码:

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&#34;递归要求&#34;错误。如果我使用std::unique_ptr<dummy,decltype(zDeleter)> get(nullptr,zDeleter);进行编译,则不会收到任何错误,但它不会让我收到funct()的返回值。奇怪的问题,但我这样做是出于研究目的。

额外问题:如果我使用auto&& zDeleter代替auto zDeleterconst auto& zDeleter,怎么会出现长时间错误?

1 个答案:

答案 0 :(得分:1)

decltype(zDeleter)是const。 std::unique_ptr<dummy,decltype(zDeleter)> get;因为你需要为你的删除者提供一个值而无法工作,因为它是一个const成员。

因为你删除函数有const修饰符,所以你不能使用赋值。

为什么不这样做:

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

或者如果您将delctype(zDeleter)替换为std::function<void(dummy*)>,则可以使用