C++ 如何访问lambda中捕获的此指针的“typeid”?
我有以下代码:C++ 如何访问lambda中捕获的此指针的“typeid”?,c++,visual-studio,visual-c++,lambda,capture,C++,Visual Studio,Visual C++,Lambda,Capture,我有以下代码: #include <iostream> class Bobo {public: int member; void function() { auto lambda = [this]() { std::cout << member << '\n'; }; auto lambda2 = [this]() { std::cout << typeid(*this).name() &l
#include <iostream>
class Bobo
{public:
int member;
void function()
{
auto lambda = [this]() { std::cout << member << '\n'; };
auto lambda2 = [this]() { std::cout << typeid(*this).name() << '\n'; };
lambda();
lambda2();
}
};
int main()
{
Bobo bobo;
bobo.function();
}
#包括
波波类
{公众:
国际会员;
空函数()
{
自动lambda=[this](){std::cout这似乎是VS的错误;在确定中的此
指针的类型时:
为了确定
对于访问非静态类成员
在上下文中考虑闭包类型的函数调用运算符
lambda表达式的
struct X {
int x, y;
int operator()(int);
void f()
{
// the context of the following lambda is the member function X::f
[=]()->int
{
return operator()(this->x + y); // X::operator()(this->x + (*this).y)
// this has type X*
};
}
};
因此,这个
的类型应该是lambda中的Bobo*
。正如@songyuanyao所建议的,您可以工作并生成适当的typeid,因此这可能是一个bug。但是-这里有一个解决方法:
#include <iostream>
class Bobo
{public:
int member;
void function() {
auto lambda = [this]() { std::cout << member << '\n'; };
auto lambda2 = [my_bobo = this]() {
std::cout << typeid(std::decay_t<decltype(*my_bobo)>).name() << '\n';
};
lambda();
lambda2();
}
};
int main() {
Bobo bobo;
bobo.function();
}
这对我来说一点也不“可理解”。这肯定是一个bug。this
的所有用法都应该指向捕获,而不是编译器生成的lambda类,对于用户来说,该类不存在。我不能使用g++
9进行复制(无选项)。它打印4Bobo
,就像@songyuanyao的测试一样。不能用和复制。你的编译器是什么?@songyuanyao我在Windows上用Visual Studio Community 2019编译。我再次检查,这是我得到的结果。我通过创建一个局部临时变量并捕获它,获得了我想要的行为。但是,这不应该发生?Nope,这是错误的。请针对VS:-)提交一个错误
#include <iostream>
class Bobo
{public:
int member;
void function() {
auto lambda = [this]() { std::cout << member << '\n'; };
auto lambda2 = [my_bobo = this]() {
std::cout << typeid(std::decay_t<decltype(*my_bobo)>).name() << '\n';
};
lambda();
lambda2();
}
};
int main() {
Bobo bobo;
bobo.function();
}
std::cout << type_name<std::decay_t<decltype(*my_bobo)>>() << '\n';