Re[11]: lambda являются first class citizens?
От: _NN_ www.nemerleweb.com
Дата: 14.05.18 20:30
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, _NN_, Вы писали:



_NN>>Попробуем по порядку.

_NN>>

first-class status if it can be passed as a parameter,


_NN>>
_NN>>#include <iostream>
_NN>>#include <memory>
_NN>>using namespace std;

_NN>>void f(auto) {}

_NN>>int main()
_NN>>{
_NN>>    f([]{});
_NN>>}
_NN>>

_>А виртуальную функцию как? А экспортировать эту функцию как, перегдужать как? То что вы привели шаблон, а не функция.

Тогда стоит для начала уточнить требования.
Я не знаю, что автор утверждения говорит насчёт шаблонов, виртуальных функций, экспорта (что такое экспорт ?) и перегрузки (о чём речь?).
Это всё не приводилось в качестве обязательных требований.

Если без шаблоном то очевидно никак нельзя заранее указать тип лямбды потому как он выводится из самой лямбды.
Однако мы можем указать тип после и передать лямбду в качестве параметра тем самым имея нешаблонную функцию и отвечая требованию 1.

int main()
{
    auto x = []{};
    
    auto f = [](decltype(x)) {};
    f(x);
}


Собственно виртуальность не проблема:
class A
{public:
     static constexpr auto x = []{};

     virtual void f(decltype(x)) {} // Объявляем
};

class B:public A
{
  void callf()
  {
    f(x); // Вызываем
  }

  virtual void f(decltype(A::x)) override {}  
};


_NN>>

returned from a subroutine, or assigned into a variable

_NN>>
_NN>>#include <iostream>
_NN>>#include <memory>
_NN>>using namespace std;

_NN>>auto f() { return []{return 1;}; } // returned from a subroutine
_>[c]
_>auto f(int f) { if (f) return [=]{return f;}; return [=]{return f-1;}; }
_>

_>И где?
Где что ?
Во первых это не относится к требования first-class из цитаты.
Во вторых оператор ?: требует одинаковые типы, а типы не одинаковые.
Этот код аналогичен
struct A{};
struct B{};

A x(int f)
{
 if (f) return A();
 return B();
}


_NN>>int main()

_NN>>{
_NN>> auto l = f(); // assigned into a variable
_NN>> return l();
_NN>>}
_NN>>[/c]
_>Assigned into variable
_>
_> l=f(); l=f(); // не работает
_>


_NN>>Приведённые требования выполняются.

_>и где они выполняются?
Тут у нас похоже разные трактования 'assigned into a variable'.
Я считаю, что если можно создать объект и передать ему значение, то требование выполняется.
С вашей стороны есть дополнительное требование, которое мне неясно имел ввиду автор или нет, а именно создание пустого значения переменной этого типа и последующее присовение.

Для лямбды копирование запрещено , но есть перемещение
Получается по этой логике тип с приватным конструктором либо с запретом на конструктор копирования или присваивания не является first-class, так ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.