Законно ли явно указывать аргументы шаблонного оператора lambda общего назначения ()?
Соответствует ли следующий код 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
).
2 ответа
Это действительно соответствует стандарту. Стандарт указывает, что должен быть член operator()
и что у него есть один аргумент шаблона для каждого случая auto
в его пункте-декларации-клаузуле. Нет такой формулировки, которая запрещает предоставлять их явно.
Внизу строки: оператор вызова лямбды - это просто нормальная функция (шаблон, если он универсален).
Для справки, соответствующий стандартный пункт:
Тип замыкания для неуниверсального лямбда-выражения имеет открытый оператор вызова встроенной функции (16.5.4), параметры и тип возвращаемого значения которого описаны в параметре-объявлении-лямбда-выражении и трейлинг-возвращаемом типе соответственно. Для обобщенной лямбды у типа замыкания есть открытый шаблон члена оператора вызова встроенной функции (17.5.2), чей список параметров-шаблонов состоит из одного изобретенного шаблона-параметра типа для каждого вхождения auto в предложении-объявления-параметра лямбды, в порядке появления. Шаблон-параметр изобретенного типа является пакетом параметров, если соответствующее объявление параметра объявляет пакет параметров функции (11.3.5). Тип возвращаемого значения и параметры функции в шаблоне оператора вызова функции выводятся из конечного-возвращаемого типа и параметра-объявления-лямбда-выражения, заменяя каждое вхождение auto в спецификаторах decl предложения-объявления-параметра на имя соответствующего придуманного шаблона-параметра.
8.1.5.1/3 [expr.prim.lambda.closure] в N4659 (C++17), выделите мое.
Да, похоже, он четко определен, поскольку параметры шаблона для лямбда-выражений operator()
строго определены.
[expr.prim.lambda]/5
...
Для обобщенной лямбды тип замыкания имеет открытый шаблон члена оператора вызова встроенной функции (14.5.2), чей список параметров-шаблона состоит из одного изобретенного шаблона-параметра типа для каждого вхожденияauto
в параметре-объявлении параметра лямбды, в порядке появления.
...