Знакомый синтаксис шаблона для общих лямбд - PullRequest
0 голосов
/ 06 июня 2018

Для c ++ 20 предлагается добавить следующий синтаксис для универсальных лямбд p0428r2.pdf

auto f = []<typename T>( T t ) {};

Но текущая реализация в gcc 8 не приняла следующую реализацию:

f<std::string>("");

Это ошибка реализации в gcc или отсутствующая языковая функция?Я знаю, что мы говорим о предложении, а не об утвержденной спецификации.

Полный пример (со сравнением с синтаксисом функции шаблона):

template <typename T> void n( T t ) { std::cout << t << std::endl; }

auto f = []<typename T>( T t ) { std::cout << t << std::endl; };

int main()
{
    f<std::string>("Hello");  // error!
    n<std::string>("World");
}

жалуется со следующей ошибкой:

main.cpp: 25: 22: ошибка: ожидаемое первичное выражение перед маркером '>' f ("Hello");

1 Ответ

0 голосов
/ 06 июня 2018

Результат лямбда-выражения не является функцией;это функция объект .То есть это тип класса с перегрузкой operator().Итак, это:

auto f = []<typename T>( T t ) {};

Эквивалентно этому:

struct unnamed
{
  template<typename T>
  void operator()(T t) {}
};

auto f = unnamed{};

Если вы хотите явно предоставить аргументы шаблона лямбда-функции, вы должны явно вызвать operator(): f.operator()<template arguments>(parameters);.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...