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

Wellarium
Wellarium
#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;
}
2
рейтинг
C++20
2 комментария
Andrey Davydov

Как я вижу по стандарту [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 (на котором Вы, видимо, проверяли) пока не успел ее поддержать.

Andrey Davydov
Wellarium

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

Wellarium
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения