Различные объявления лямбда-выражения, которые фиксируют параметр внутри C 20, требуют выражений

#c #lambda #lan&ua&e-lawyer #c 20 #c -concepts

#c #лямбда #язык-юрист #c 20 #c -концепции

Вопрос:

Рассмотрим следующие две простые концепции:

 template <typename T&&t;
concept C1 = requires(T t) {
  [t = t]{ t; };
};

template <typename T&&t;
concept C2 = requires(T t) {
  [t]{ t; };
};
  

На мой взгляд, два объявления должны быть эквивалентны, но GCC отклоняет concept C2 и говорит:

 <source&&t;:10:9: error: use of parameter outside function body before ';' token
  

Почему GCC принимает только concept C1 , или это просто ошибка? Если нет, то в чем разница между этими двумя объявлениями?

Ответ №1:

Простой захват (как [t] во втором примере) может фиксировать только локальные переменные и / или this . Однако параметры requirements-expression не являются локальными переменными. Это не проблема для init-captures (как в вашем первом примере).