Идиоматический способ определения ограничения типа при пересылке ссылочного аргументаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Идиоматический способ определения ограничения типа при пересылке ссылочного аргумента

Сообщение Anonymous »

При использовании ограничения типа для аргумента ссылки на пересылку ограничение задается как ссылка lvalue на тип. Например, вызов h в следующем коде не компилируется, так как для его хранения потребуется std::integral, но для ссылок интегральный неверен (см. https://godbolt.org/z/Taeb5Exdv):

Код: Выделить всё

#include 

void f(std::integral auto &i) {}
void g(const std::integral auto &i) {}
void h(std::integral auto &&i) {}

int main() {
int one = 1;
f(one);
g(one);
h(one); // "[...] the expression 'is_integral_v [with _Tp = int&]' evaluated to 'false'"
}
(Эта ошибка мне кажется нелогичной, поскольку f и g будут оценивать целое, а не целое/

Код: Выделить всё

integral
, поэтому мой разум неосознанно экстраполировал это на «правило», например «аргументы шаблона удалили cvref». Но ладно, это сложнее; ссылки на пересылку разные, возможно, по какой-то причине; Я могу принять, что это просто «то, как это работает».)
Я могу обойти это, заменив h, например, на (см. https://godbolt.org/z/fa9f7eeq6)

Код: Выделить всё

void h1(auto &&i) requires std::integral  {}
или

Код: Выделить всё

template 
void h2(T &&i) requires std::integral  {}
или

Код: Выделить всё

template 
concept Integral_without_cvref = std::integral;

void h3(Integral_without_cvref auto &&i) {}
Все они немного сложны: h1 и h2 требуют большего синтаксиса в объявлениях функций, а h3 требует специальной концепции.
Есть ли более идиоматический/краткий способ объявления ограничений на пересылку ссылочных аргументов?

Подробнее здесь: https://stackoverflow.com/questions/797 ... e-argument
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»