2016-02-05 120 views
4
struct myclass { 
myclass(){} 
myclass(int qx):z(qx){ } 
std::function<void()> create() { 
    auto px = [z](){ 
     std::cout << z << std::endl; 
    }; 
    return px; 
} 
int z; 
}; 

myclass my; 
my.z = 2; 
auto func = my.create(); 
func(); 
my.z = 3; 
func(); 

這個代碼編譯4.6.3,這將做正確的事情,使成員變量z的副本,都打印將獲得2 4.8.2,這並不編譯了..在C++ 11中通過值捕獲成員變量的好方法是什麼?

error: ‘this’ was not captured for this lambda function 

我想知道爲什麼這個功能被刪除,因爲它非常有用。

回答

4

我不認爲您可以直接在C++ 11中執行此操作(請參閱@ Nawaz對解決方法的評論)。然而,C++ 14恰好有助於這種情況下,經由generalized lambda captures

auto px = [v = this->z]() // capture by value just ONE member variable 
{ 
     std::cout << v << std::endl; 
}; 

實施例:

#include <functional> 
#include <iostream> 

struct myclass { 
    myclass(): z{} {} 
    myclass(int qx): z(qx) { } 
    std::function<void()> create() { 
     auto px = [v = this->z]() { 
      std::cout << v << std::endl; 
     }; 
     return px; 
    } 
    int z; 
}; 

int main() 
{ 
    myclass my; 
    my.z = 2; 
    auto func = my.create(); 
    func(); 
    my.z = 3; 
    func(); 
} 

Live on Coliru

+3

解決方法:'自動Z =這個 - > Z者除外; auto px = [z] {...};'。 – Nawaz

+0

@Nawaz是的,的確,謝謝。 – vsoftco

2

lambda表達式只能捕獲在它們所聲明的本地範圍的成員。他們無法通過複製或引用來捕獲成員變量。

然而,C++ 14的廣義拉姆達捕捉可以完成這項工作:

auto px = [z = z](){ 
    std::cout << z << std::endl; 
}; 

你可以限定內zthis->z,使你在做清楚什麼。

如果C++ 14不可用,可以使拍攝在你的函數創建一個臨時變量明確,這將被捕獲:

auto z = this->z; 
auto px = [z](){ 
    std::cout << z << std::endl; 
}; 
相關問題