[英]How to define a lambda expression without both std::function and auto?
我已經閱讀了“Effective Modern C++”的 item31 和http://en.cppreference.com/w/cpp/language/lambda 的網頁,想知道我是否可以通過它的確定類型而不是包裝類型來定義 lambda std::function 或auto
關鍵字以及如何實現。
例如,對於int
類型:
auto x_1 = 5; // type deduction
int x_2 = 5; // defined by definite type
// both x_1, x_2 are int variables of value 5
現在,當問題出現在 lambda 上時:
auto f_1_0 = []()->int{return 5;};
std::function<int(void)> f_1_1 = []()->int{return 5;};
SomeType f_2 = []()->int{return 5;}; // what's the SomeType here?
每個 lambda 表達式都有自己獨特的類型。
這里的表達式 f_1 和 f2 有不同的類型。
auto f_1 = []()->int {return 5; };
auto f_2 = []()->int {return 5; };
分配 f_2 = f_1 是非法的。
標准說這些類型是“未命名的”。 實際上,編譯器可能會為每個 lambda 組成一個新的隱藏類型名。 Visual C++17 給了它們以下名稱。
classmain::<lambda_7e9d7fb093569d78a8c871761cbb39d7>
classmain::<lambda_8f061a3967cd210147d6a4978ab6e125>
不是很有用的信息。
標准說 lambda 的類型是未命名的,因此實現創建了一個實現定義的名稱,它使用類似於其他未命名的類、結構體枚舉等。
ISO C++:5.1.2 Lambda 表達式 [expr.prim.lambda]
3 lambda 表達式的類型(也是閉包對象的類型)是一個唯一的、未命名的非聯合類類型——稱為閉包類型——其屬性如下所述。
該標准還說 lambda '表現得像一個函數',所以它可以與std::function
模板一起使用:
[注意:閉包對象的行為類似於函數對象(20.9)。-尾注]
如果你真的想給你的名字命名,可以使用老式的 函子,並用lambdas 來完成編譯器為你做的所有工作。
在某些情況下,您可以使用函數指針(使用 mvcpp,0x17):
auto usingAuto = []() {
cout << "autoMagick" << endl;
};
void(*pureCpp)() = []() {
cout << "pureCpp" << endl;
};
//pureCpp = usingAuto; //you can even assing function pointers from lambdas
//usingAuto = pureCpp; //error
pureCpp();
usingAuto();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.