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