簡體   English   中英

顯式指定泛型 lambda 的 operator() 模板參數是否合法?

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

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