簡體   English   中英

如何在沒有 std::function 和 auto 的情況下定義 lambda 表達式?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM