Re: Типы лямбд
От: uzhas Ниоткуда  
Дата: 19.09.14 07:08
Оценка: 2 (1) +1
Здравствуйте, 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.

Re: Типы лямбд
От: niXman Ниоткуда https://github.com/niXman
Дата: 19.09.14 00:57
Оценка: 2 (1)
Здравствуйте, watchyourinfo, Вы писали:

W>... есть ли гарантия, что две одинаковые лямбды []{} в соседних строчках будут иметь один и тот же тип??


не будут.
auto l0 = [](){};
auto l1 = [](){};
std::cout << std::is_same<decltype(l0), decltype(l1)>::value << std::endl;

0

пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Типы лямбд
От: watchyourinfo Аргентина  
Дата: 19.09.14 00:53
Оценка:
Ну как бы понятно, что типы лямбд явно не прописаны, но хотя бы есть ли гарантия, что две одинаковые лямбды []{} в соседних строчках будут иметь один и тот же тип??

Желательно со ссылками на писание/
Re: Типы лямбд
От: PM  
Дата: 19.09.14 07:45
Оценка:
Здравствуйте, 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';
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.