我正在關注本
這顯示在除錯視窗中。
我希望auto用原始資料型別替換關鍵字。我嘗試了以下方法,但失敗了:
HttpResponse say_hello = [](const HttpRequest& request) -> HttpResponse {...}
有人能告訴我為什么錯了嗎?什么是正確的解決方案?非常感謝!!!
uj5u.com熱心網友回復:
我認為在使用 lambda 時了解以下 3 種方法很重要。這三個第一次基本上做同樣的事情:存盤 lambda 以備將來使用。另一個似乎是您對代碼的期望:您直接呼叫 lambda 并獲取結果,因此回傳型別是 lambda 回傳的型別。
#include <iostream>
#include <functional>
int main()
{
// Auto store the lambda
auto auto_keyword = [](int a) -> int
{ return a; };
std::cout << auto_keyword(42) << std::endl;
// std::function store the lambda
std::function<int(int)> std_function = [](int a) -> int
{ return a; };
std::cout << std_function(42) << std::endl;
// raw function pointer
int (*raw_fptr)(int) = [](int a) -> int
{ return a; };
std::cout << raw_fptr(42) << std::endl;
// direct call to the lambda. (what you expect from your question)
std::cout << ([](int a) -> int{ return a; })(42) << std::endl;
return 0;
}
這里發生了很多事情,我建議您至少閱讀此頁面作為參考,以便更好地理解。
uj5u.com熱心網友回復:
根據cppreference,(強調我的)
lambda 運算式是唯一的未命名非聯合非聚合型別別的純右值運算式,稱為閉包型別
由于 lambda 運算式的型別是未命名型別,因此您不能在宣告中使用它。這就是為什么auto是 lambda 的常見用法的原因。
如果您想對引數和回傳型別更明確,可以將 lambda 存盤在std::function變數中:
std::function<HttpResponse(const HttpRequest&)> say_hello = ...
但std::function仍然不是真正的 lambda 型別(未命名......),它只是能夠保存該 lambda 的變數的型別,因為它可能是普通函式的地址。
如需進一步參考,C 20 的 n4860 草案在 7.5.5.1 Closure types [expr.prim.lambda.closure] §1 中說
lambda 運算式的型別(也是閉包物件的型別)是唯一的、未命名的非聯合型別別,稱為閉包型別...
uj5u.com熱心網友回復:
來自 C 標準
[C 11: 5.1.2/3]:lambda 運算式的型別(也是閉包物件的型別)是唯一的、未命名的非聯合型別別——稱為閉包型別——其屬性為如下面所描述的。此型別別不是聚合 (8.5.1)。閉包型別在包含相應 lambda 運算式的最小塊作用域、類作用域或命名空間作用域中宣告。
簡而言之,lambda 的每個實體都是它自己唯一的未命名型別。
[C 11: 5.1.2/5]:lambda 運算式的閉包型別有一個公共行內函式呼叫運算子 (13.5.4),其引數和回傳型別由 lambda 運算式的引數宣告子句描述和尾隨回傳型別。
由于 lambda 定義了函式呼叫運算子,您可以將其分配給 std::function
[C 11: 5.1.2/6]:沒有 lambda 捕獲的 lambda 運算式的閉包型別有一個公共的非虛擬非顯式 const 轉換函式,指向具有相同引數和回傳型別的函式的指標閉包型別的函式呼叫運算子。這個轉換函式的回傳值應該是一個函式的地址,當被呼叫時,它與呼叫閉包型別的函式呼叫運算子具有相同的效果。
如果 lambda 沒有捕獲任何內容,則可以將其轉換為函式指標。
uj5u.com熱心網友回復:
通常,lambda 運算式是一個匿名函式物件,它沒有命名型別。但是,有時我們可以使用型別擦除。如果 lambda 運算式沒有像您的示例那樣捕獲任何引數,它可以隱式轉換為函式指標。如果 lambda 運算式捕獲了一些引數,它可以轉換為std::function.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/472093.html
