cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Разрешить использование концептов через requires в лямбда выражениях #370

Closed apolukhin closed 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +2, -0 Автор идеи: Wellarium

В С++20 будет добавлена возможность указать список параметров шаблона для generic лямбда выражений, что позволяет использовать конструкции std::enable_if, std::void_t и т.п. для наложения ограничений на типы аргументов. Концепты же вводятся с целью поддержки такой функциональности на уровне языка: они работают для шаблонов классов, функций, но с лямбдами есть ограничения. Предлагаю разрешить использование всех способов объявления концептов в лямбдах, пока еще не поздно, чтобы концепты можно было полноценно применять ко всем шаблонным конструкциям языка.

#include <iostream>

template<typename T>
concept Addable = requires (T x) { x + x; }; 

int main() {

    []<Addable T>(T a1, T a2) {     //работает корректно
        std::cout << a1 + a2;
    }(1, 2); 

    /*[]<typename T> requires Addable<T> //уже не скомпилируется
    (T a1, T a2){ 
        std::cout << a1 + a2; 
    }(3, 4); */

    /*[]<typename T> requires requires (T x) { x + x; } //не скомпилируется
    (T a1, T a2){ 
        std::cout << a1 + a2; 
    }(5, 6); */

    return 0;
}
apolukhin commented 3 years ago

Andrey Davydov, 24 октября 2018, 7:45 Как я вижу по стандарту [expr.prim.lambda]:

lambda-expression:
  lambda-introducer compound-statement
  lambda-introducer lambda-declarator requires-clause_opt compound-statement
  lambda-introducer < template-parameter-list > requires-clause_opt compound-statement
  lambda-introducer < template-parameter-list > requires-clause_opt
    lambda-declarator requires-clauseopt compound-statement
...

это разрешенная конструкция, просто gcc (на котором Вы, видимо, проверяли) пока не успел ее поддержать.

Wellarium, 24 октября 2018, 22:23 Andrey Davydov, да, Вы правы :) Я смотрел Concepts TS, который реализован в gcc, там про лямбда-выражения не упоминалось. Здорово, что это уже будет в стандарте.