Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何访问lambda中捕获的此指针的“typeid”?_C++_Visual Studio_Visual C++_Lambda_Capture - Fatal编程技术网

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';