Чи дозволено виразів, щоб "захоплювати" змінні змістовної області?


10

У наступному прикладі аргументи функції використовуються для тестування з необхідним вираженням, чи добре сформований вираз з їх допомогою. Вираз, що вимагає, не має аргументів; він безпосередньо використовує змінні в області функцій:

#include <cstddef>
#include <vector>

template<typename T>
void Resize(T &v, std::size_t const n)
{
  if constexpr (requires { v.resize(n); })
    v.resize(n);
}

template<typename T>
void Eziser(T &v, std::size_t const n)
{
  if constexpr (requires { v.eziser(n); })
    v.eziser(n);
}

int main()
{
  std::vector<int> v;

  Resize(v, 10u);
  Eziser(v, 10u);
}

Наведений вище код поєднується з відділенням понять Кланг. Однак GCC10 приймає лише виклик Resize. GCC9 ДВС. Чи правильно Кланг прийняв це?


2
ICE - це завжди компілятор.
Jarod42

Я б сказав, що або він повинен відхиляти код, якщо йому не дозволяється захоплювати локальну змінну (тому обидва Resizeі Eziserповинні бути відхилені) або обидві функції повинні компілюватися. Я б сказав, що Кланг прав.
Jarod42

@ Jarod42 Так. Поведінка GCC явно баггі. Я подам PR. Я також вважаю, що Кланг має рацію, але хотів би підтвердити.
металфокс

Відповіді:


6

Так, вимагає вираз може використовувати все, що є в області застосування. Зрештою, йому потрібен лише тип того, що він називає, за винятком вкладеної вимоги чи іншого постійного вираження. Це справедливо для оточуючих декларацій так само, як і для його власних (формальних) параметрів.

[expr.prim.req] / 5 :

Орган вимоги містить послідовність вимог . Ці вимоги можуть стосуватися локальних параметрів, параметрів шаблону та будь-яких інших оголошень, видимих ​​із контексту, що додається.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.