c++ 无法使用lambda作为自定义删除器构造std::unique_ptr

qco9c6ql  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(156)

我尝试使用自定义删除器声明std::unique_ptr

using FILE = int;

FILE *f = nullptr;

std::unique_ptr pf(f, [](FILE *f) {});

但没有成功。怎么了?
如何使用lambda作为删除器?我真的需要decltype吗?
MSVC编译器错误(std==C++17):

error C2641: cannot deduce template arguments for 'std::unique_ptr'
cidc1ykv

cidc1ykv1#

正如注解中提到的,如果传递删除器,则不能使用CTAD来构造std::unique_ptr
如果需要使用lambda,可以将其存储在变量中,并使用decltype来推断其类型:

#include <memory>

//...

using FILE = int;
FILE* f = nullptr;
auto my_lambda = [](FILE* f) {};
std::unique_ptr<FILE, decltype(my_lambda)> pf(f, my_lambda);

Live demo - Godbolt
正如@NebularNoise评论的那样,c20在未求值的上下文中支持lambda表达式。如果你可以使用c20(你提到你目前使用c++17),你可以把它缩短一点:

using FILE = int;
FILE* f = nullptr;
std::unique_ptr<FILE, decltype([](FILE* f) {})> pf(f);

Live demo - Godbolt

相关问题