Законно ли явно указывать аргументы шаблонного оператора 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 в параметре-объявлении параметра лямбды, в порядке появления.
...

Другие вопросы по тегам