Considere la situación en la que una plantilla de función necesita reenviar un argumento manteniendo su valor en caso de que sea un valor no const, pero es agnóstico de lo que realmente es el argumento, como en :Deducción de tipo de argumento, referencias y valores
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);
}
Cuando x
es un valor de lado derecho, en lugar de T
deduciéndose a un tipo constante, se da un error:
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
parece que para forward
para manejar rvalues (sin callin g para argumentos de plantilla explícitos) debe haber una sobrecarga forward(const T&)
, aunque su cuerpo sería un duplicado exacto.
¿Hay alguna forma de evitar esta duplicación?
Si está sobrecargando lvaluenes como este, merece que le disparen. – Yttrill