Не имея троичных операторов сравнения в Python (например, a <= b <= c
), я решил создать утилиту для своего проекта
template <typename T>
bool between(T&& low, T&& test, T&& high)
{ return ( low <= test && test <= high ); }
Вначале я заявляю, что явно не получаю идеальную пересылку, но я подумал, что это было специально для него использовано.
Сбой при смешивании lvalue и rvalues:
int const low = 0;
int const high = 10;
int test = 42;
between(low, test, high);
Это дает ошибку компиляции:
error: no matching function for call to ‘between(const int&, int&, const int&)’
note: candidate: template<class T> bool between(T&&, T&&, T&&)
between(T&& low, T&& test, T&& high)
^~~~~~~
note: template argument deduction/substitution failed:
note: deduced conflicting types for parameter ‘T’ (‘const int&’ and ‘int&’)
Я думал, что смысл идеальной пересылки - быть нечувствительным к константности в шаблонах. Понятно, что я ошибался, и это не кандидат на идеальное перенаправление, но я хотел бы понять, почему.
(чтобы не отвлекаться на попытки исправить мою ошибку компиляции, я изменил сигнатуру функции так, чтобы логические операции были логически постоянными:
template <typename T>
bool between(T const& low, T const& test, T const& high);
и ошибки компиляции исчезают. Я мог бы также передать по значению и получить тот же эффект)