[英]Is it possible to explicitly specify template arguments in a generic lambda passed to a function?
[英]Is it legal to explicitly specify a generic lambda's operator() template arguments?
是否符合以下 C++ 代碼標准?
#include <iostream>
int main()
{
[](auto v){ std::cout << v << std::endl; }.operator()<int>(42);
}
clang++ 3.8.0和g++ 7.2.0 都可以很好地編譯此代碼(編譯器標志是-std=c++14 -Wall -Wextra -Werror -pedantic-errors
)。
這確實符合標准。 該標准規定必須有一個成員operator()
,並且它的參數聲明子句中每次出現auto
時都有一個模板參數。 沒有任何文字禁止明確提供這些內容。
底線:lambda 的調用運算符只是一個普通函數(模板,如果是通用的)。
作為參考,相關標准條款:
非泛型 lambda 表達式的閉包類型具有公共內聯函數調用運算符 (16.5.4),其參數和返回類型分別由 lambda 表達式的參數聲明子句和尾隨返回類型描述。 對於泛型 lambda,閉包類型有一個公共內聯函數調用運算符成員模板 (17.5.2),其模板參數列表由一個發明的類型模板參數組成,用於在 lambda 的參數聲明子句中每次出現 auto,按出場順序。 如果相應的參數聲明聲明函數參數包(11.3.5),則發明的類型模板參數是參數包。 函數調用運算符模板的返回類型和函數參數派生自 lambda 表達式的尾隨返回類型和參數聲明子句,方法是將參數聲明子句的聲明說明符中每次出現的 auto 替換為相應的發明模板參數的名稱。
N4659 (C++17) 中的 8.1.5.1/3 [expr.prim.lambda.closure],強調我的。
是的,它似乎是明確定義的,因為 lambda 的operator()
模板參數是嚴格定義的。
[expr.prim.lambda]/5
...
對於泛型 lambda,閉包類型有一個公共內聯函數調用運算符成員模板 (14.5.2),其模板參數列表由一個發明的類型模板參數組成,用於在 lambda 的參數聲明子句中每次出現auto
,按出場順序。
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.