Ну как бы понятно, что типы лямбд явно не прописаны, но хотя бы есть ли гарантия, что две одинаковые лямбды []{} в соседних строчках будут иметь один и тот же тип??
Желательно со ссылками на писание/
Здравствуйте, watchyourinfo, Вы писали:
W>... есть ли гарантия, что две одинаковые лямбды []{} в соседних строчках будут иметь один и тот же тип??
не будут.
auto l0 = [](){};
auto l1 = [](){};
std::cout << std::is_same<decltype(l0), decltype(l1)>::value << std::endl;
0
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, watchyourinfo, Вы писали:
W>Ну как бы понятно, что типы лямбд явно не прописаны, но хотя бы есть ли гарантия, что две одинаковые лямбды []{} в соседних строчках будут иметь один и тот же тип??
W>Желательно со ссылками на писание/
две лямбды должны иметь разные типы
5.1.2 Lambda expressions [expr.prim.lambda]
...
3 The type of the lambda-expression (which is also the type of the closure object) is a unique, unnamed nonunion
class type — called the closure type — whose properties are described below. This class type is not
an aggregate (8.5.1). The closure type is declared in the smallest block scope, class scope, or namespace
scope that contains the corresponding lambda-expression.
Здравствуйте, watchyourinfo, Вы писали:
W>Ну как бы понятно, что типы лямбд явно не прописаны, но хотя бы есть ли гарантия, что две одинаковые лямбды []{} в соседних строчках будут иметь один и тот же тип??
Как уже ответили, тип у каждой лямбды будет уникальным. Если стоит задача хранить лямбды с одинаковыми сигнатруами, то используете std::function. Если лямбда ничего не захватывает, то ее можно использовать в указателе на функцию:
#include <functional>
#include <iostream>
int main()
{
auto l1 = [](int x) -> int { return x; };
auto l2 = [](int x) -> int { return x * x; };
std::function<int (int)> f;
f = l1;
std::cout << f(1) << '\n';
f = l2;
std::cout << f(2) << '\n';
int (*f_ptr)(int);
f_ptr = l1;
std::cout << f_ptr(3) << '\n';
f_ptr = l2;
std::cout << f_ptr(4) << '\n';
}