lambda表達式捕獲成員變量


lambda可以捕獲局部變量,但無法顯式捕獲類成員。如果在lambda中指定

auto func = [=](){};

以傳值方式捕獲所有變量,將捕獲this,從而可訪問類成員。例如下列偽代碼,

class foo {
public:
    void show() const {
       auto print = [=](){
            std::cout << m_x << std::endl;
        };
    print(); }
private: int m_x; };

lambda表達式print隱式捕獲了this,並訪問類成員m_x。而在訪問m_x時,其實表示的是表示this->m_x,也可以顯式的說明this->m_x。lambda捕獲的this是類的指針,lambda的this無法獲取。

同樣,以引用方式捕獲所有變量時也將捕獲this,從而可訪問類成員。無論是傳值捕獲還是引用捕獲,this的捕獲方式永遠是按值傳遞。

 

在lambda中若不想捕獲this,又要訪問單個類成員,現有方式暫不支持。如:

class foo {
public:
    void show() const {
       auto print = [m_x](){
            std::cout << m_x << std::endl;
        };
    print();
    }

private:
    int m_x;
    int m_y;
};   

編譯將報錯,即無法單獨捕獲類成員,因為lambda只捕獲對其可見的變量,包括全局變量、局部變量、類的this指針,類成員不在此列。

可以聲明一個引用,對類成員起個別名,再捕獲此引用變量:

class foo {
public:
    void show() const {
    auto& refx_x = m_x;   auto print
= [&refx_x](){ std::cout << refx_x << std::endl; };     print(); } private: int m_x; int m_y; };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM