2015-12-17 2 views
0

Я ищу контрпример для опровержения утверждения о том, что любое лямбда-выражение может быть выражено как (шаблонная) структура. Другими словами, можно написать компилятор источника-источника, который должен поднять каждое выражение лямбда из любой области действия и выразить его как шаблонный класс функторов.Может ли любое выражение лямбда быть выражено как (шаблонная) структура

Например, насколько конечный пользователь касается, следующие два эквивалентны:

auto foo(int parm){ 
    ... 
    auto f = [x,&y](int z) {..}; 
    .. 
    return foo(parm); 
} 

может быть выражен как

template<class X, class Y> 
struct Closure { 
    X x; Y y; 
    auto operator()(int z) {..}; 
}; 
auto foo(int parm) { 
    ... 
    auto f = Closure<decltype(x), decltype(y)&>{x,y}; 
    ... 
    return f(parm); 
} 

Может это преобразование всегда можно сделать? Если нет, есть ли пример, который может это продемонстрировать. Благодаря!

+0

Да. Фактически, это по существу то, как определяются типы закрытия. –

+0

Если бы не полиморфные лямбды, вы могли бы даже поставить «ручную лямбду» в область охвата. – melak47

+0

Я не уверен, что я следую. Как вы это делаете? – eg0x20

ответ

4

Тип замыкания лямбда-типа класса с перегруженным operator() ([expr.prim.lambda]/3). Преобразование, которое вы описываете , составляет, выполняемое каждый раз, когда речь идет о выражении лямбда - по реализации.

+0

Для не требующих захвата lambdas вам также понадобится статическая функция с телом лямбда, поэтому вы можете обеспечить преобразование в указатель свободной функции, я думаю. – melak47

0

Структура и закрытие лямбда не совсем эквивалентны, так как захваченные переменные не обязательно должны быть в самой структуре. Эта часть определяется реализацией.

+0

Я полагаю, вы хотите сказать, что реализация лямбда среди разных компиляторов не обязательно эквивалентна. Это просто говорит о том, что внедрение lambda в качестве шаблонной структуры равнозначно любой другой реализации, насколько это соответствует требованиям ISO C++. Вопрос в том, есть ли что-нибудь, что предотвращает реализацию лямбда в качестве шаблонной структуры как ISO C++? – eg0x20

Смежные вопросы