Почему скобки нужны вокруг отрицательных выражений в предложении require? - PullRequest
0 голосов
/ 29 марта 2020

Следующий код является примером использования условия requires:

#include <type_traits>

template <typename T>
  requires std::is_integral_v<T>
void take_integral(T value);

Он принимает выражение, которое преобразуется в значение bool (в данном случае std::is_integral_v<T>), и работает как и ожидалось. Однако, когда такое выражение отменяется с помощью оператора !, это приводит к ошибке компиляции:

#include <type_traits>

template <typename T>
  requires !std::is_integral_v<T>
void take_integral(T value);

Диагностика c из G CC:

<source>:4:12: error: expression must be enclosed in parentheses
    4 |   requires !std::is_integral_v<T>
      |            ^~~~~~~~~~~~~~~~~~~~~~
      |            (                     )
Compiler returned: 1

Диагностика c от Clang:

<source>:4:12: error: parentheses are required around this expression in a requires clause
  requires !std::is_integral_v<T>
           ^~~~~~~~~~~~~~~~~~~~~~
           (                     )
1 error generated.
Compiler returned: 1

Зачем здесь скобки?

1 Ответ

4 голосов
/ 29 марта 2020

Скобки обязательны, поскольку они позволяют избежать неоднозначности в синтаксическом анализе языка.

Не все выражения допускаются внутри requires -пункта. Фактически, стандарт дает пример того, как возникла бы неоднозначность синтаксического анализа, если бы были разрешены все выражения:

[temp.pre] / 9

[ ...] Выражение в require-clause использует ограниченную грамматику, чтобы избежать двусмысленности. Круглые скобки могут использоваться для указания произвольных выражений в require-clause . [Пример:

template<int N> requires N == sizeof new unsigned short
int f();            // error: parentheses required around == expression

- конец примера]

В приведенном стандартом примере, приведенном выше, компилятор не может знать, следует ли анализировать часть sizeof как sizeof выражения new unsigned short или new unsigned short int. Скобки вокруг него, например requires (N == sizeof new unsigned short), решают проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...