Когда использовать идеальную переадресацию, а когда быть явным? - PullRequest
0 голосов
/ 21 мая 2019

Не имея троичных операторов сравнения в 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);

и ошибки компиляции исчезают. Я мог бы также передать по значению и получить тот же эффект)

...