Недавно я просмотрел это видео, объяснив идеи концепций lite в С++, которые, вероятно, появятся в этом году как TS. Теперь я также узнал о ссылках на универсальные ссылки/пересылки (как описано здесь) и что T && & может иметь два значения в зависимости от контекста (т.е. если выполняется дедукция типа или нет). Это естественно приводит к вопросу о том, как концепции будут взаимодействовать с универсальными ссылками?
Чтобы сделать это конкретным, в следующем примере мы имеем
void f(int&& i) {}
int i = 0;
f(i); // error, looks for f(int&)
f(0); // fine, calls f(int&&)
и
template <typename T>
void f(T&& test) {}
int i = 0;
f(i); // fine, calls f(T&&) with T = int& (int& && = int&)
f(0); // fine, calls f(T&&) with T = int&& (int&& && = int&&)
Но что произойдет, если мы будем использовать понятия?
template <typename T>
requires Number<T>
void f(T&& test) {}
template <Number T>
void g(T&& test) {}
void h(Number&& test) {}
int i = 0;
f(i); // probably should be fine?
f(0); // should be fine anyway
g(i); // probably also fine?
g(0); // fine anyway
h(i); // fine or not?
h(0); // fine anyway
Особенно последний пример меня немного беспокоит, так как есть два противоречивых принципы. Во-первых, предполагается, что концепция, используемая таким образом, работает как тип, а вторая, если T - выведенный тип, T && обозначает универсальную ссылку вместо ссылки rvalue.
Заранее благодарим за это!