lambda表示式捕獲成員變數
阿新 • • 發佈:2021-12-16
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; };