1. 程式人生 > 其它 >lambda表示式捕獲成員變數

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 print = [m_x](){
            auto& refx_x = m_x;
            std::cout << refx_x << std::endl;
        };
    print();
    }

private
: int m_x; int m_y; };