这是我的代码:
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 zDeleter
或const auto& zDeleter
,怎么会出现长时间错误?
答案 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*)>
,则可以使用