В следующем примере аргументы функции используются для проверки с помощью выражения require, правильно ли сформировано выражение, использующее их. Выражение require не имеет аргументов; он напрямую использует переменные в области действия функции:
#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);
}
Приведенный выше код компилируется с веткой концепций Clang. Однако GCC10 принимает только вызов Resize
. GCC9 ICE. Прав ли Кланг принять это?
c++
c++20
c++-concepts
metalfox
источник
источник
Resize
иEziser
должны быть отклонены), либо обе функции должны компилироваться. Я бы сказал, что лязг прав.Ответы:
Да, выражение require может использовать все, что находится в области видимости. В конце концов, ему нужен только тот тип, который он называет, кроме как во вложенном требовании или другом константном выражении. Это верно как для окружающих объявлений, так и для собственных (формальных) параметров.
[expr.prim.req] / 5 :
источник