我尝试使用自定义删除器声明std::unique_ptr:
std::unique_ptr
using FILE = int; FILE *f = nullptr; std::unique_ptr pf(f, [](FILE *f) {});
但没有成功。怎么了?如何使用lambda作为删除器?我真的需要decltype吗?MSVC编译器错误(std==C++17):
decltype
error C2641: cannot deduce template arguments for 'std::unique_ptr'
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
1条答案
按热度按时间cidc1ykv1#
正如注解中提到的,如果传递删除器,则不能使用CTAD来构造std::unique_ptr。
如果需要使用lambda,可以将其存储在变量中,并使用
decltype
来推断其类型:Live demo - Godbolt
正如@NebularNoise评论的那样,c20在未求值的上下文中支持lambda表达式。如果你可以使用c20(你提到你目前使用c++17),你可以把它缩短一点:
Live demo - Godbolt