Выведение типа аргумента, ссылки и rvalue

Рассмотрим ситуацию, когда шаблон функции должен пересылать аргумент, сохраняя его lvalue-ness в случае, если это неконстантное lvalue, но сам не зависит от того, какое на самом деле аргумент такой:

template <typename T>
void target(T&) {
    cout << "non-const lvalue";
}

template <typename T>
void target(const T&) {
    cout << "const lvalue or rvalue";
}


template <typename T>
void forward(T& x) {
    target(x);
}

Когда x является r-значением, вместо T , выводимого к константному типу, это дает ошибку:

int x = 0;
const int y = 0;

forward(x); // T = int
forward(y); // T = const int
forward(0); // Hopefully, T = const int, but actually an error
forward<const int>(0); // Works, T = const int

Кажется, что для forward для обработки значений r (без вызова явных аргументов шаблона) должна быть перегрузка forward (const T &) , даже если ее тело будет точной копией.

Есть ли способ избежать этого дублирования?

6
задан uj2 2 January 2011 в 13:23
поделиться