2013-02-01 21 views
3

所以我現在有類似這樣的代碼:在C++ 11的lambdas中使用封閉函數中的模板類型可以嗎?

(注意:不是實際的代碼,只需從簡潔有點漫長而複雜的方法相比下來)

template<typename ArgT0, typename ArgT1, typename FuncT> 
static void addMethod(const std::string& name, FuncT func) 
{ 
    Method script_func = [&](const Arguments& args) -> Value 
    { 
     func(UnsafeAnyCast<ArgT0>(args[0]),UnsafeAnyCast<ArgT1>(args[1])); 
     return Value::Undefined(); 
    } 

    _prototype->Set(name, script_func); 
} 

它正常工作,在Visual Studio 2010年,但我知道這是遠遠不能保證它是符合標準的C++。至於在lambda中使用模板參數有什麼問題嗎?

+0

什麼是「爭」? – Jagannath

+1

它應該與問題無關,但參數是通過函數調用以嵌入式腳本語言傳遞的參數的容器類。我的問題是在lambda中是否符合標準要使用ArgT0和ArgT1模板類型。 – Gerald

+0

我明白這個問題。由於參數在函數的任何地方都沒有出現,所以我問了一下。 – Jagannath

回答

1

是的,這是符合標準的:一個lambda表達式可以訪問其封閉範圍內的所有可見的名稱,它只是你需要捕獲

5.1.2 Lambda表達式變量[expr.prim.lambda ]

9所述的λ-表達式,其最小的封閉範圍是塊範圍 (3.3.3)是本地lambda表達式;其他lambda表達式 的lambda-introducer中不應包含捕獲列表。當地lambda表達式的深遠 範圍是一套封閉範圍可達 幷包括最內層函數及其參數

相關問題