发新话题
打印

std::get_deleter 为什么返回为 null?c++ lambda 相同原型,其 typeid 一样吗?

std::get_deleter 为什么返回为 null?c++ lambda 相同原型,其 typeid 一样吗?

代码 :
#include <iostream>
int main()
{
auto x = [](int *) {};
auto y = [](int *) {};
std::cout << "x typeid: " << typeid(decltype(x)).name() << std::endl;
std::cout << "y typeid: " << typeid(decltype(y)).name() << std::endl;
}
输出:
x typeid: class <lambda_5ce039d8eebcb2cdcfd08ea27e765fa4>
y typeid: class <lambda_0f30135fad7a0f18ac2e2e72a933e102>

结论:看上去两个lambda 原型都是  void f(int *)
但他们的 typeid 完全不同的。

这个结论有什么问题吗?取一个 shared_ptr的自定义deleter ,
#include <iostream>
#include <memory>
int main()
{
std::shared_ptr<int> shared_int(new int{ 100 }, [](int* ptr) {
std::cout << "custom deleter here." << std::endl;
});
auto x = [](int *) {};
auto deleter = std::get_deleter<decltype(x)>(shared_int);
std::cout << "deleter is null ?  " << (deleter == nullptr) << std::endl;
}
输出:
deleter is null ?  1
可以看出,没有取到

使用预定义 std::function类,可以绕过
#include <iostream>
#include <memory>
int main()
{
using my_deleter = std::function<void(int*)>;
my_deleter del = [](int* ptr) {
std::cout << "custom deleter here." << std::endl;
};
std::shared_ptr<int> shared_int(new int{ 100 }, del);
auto deleter = std::get_deleter<my_deleter>(shared_int);
std::cout << "deleter is null ?  " << (deleter == nullptr) << std::endl;
}
输出:
deleter is null ?  0

结论:
要取到 deleter 必须预定义 std::function ,这样在定义和取用时,有一致的 typeid。get_deleter方法内部会对比 deleter 的 typeid.
附件: 您所在的用户组无法下载或查看附件

TOP

发新话题