Esto se menciona como una solución potencial en the document I vinculado en el recent C++0x forwarding question.
Es funcionan bastante bien, pero se rompe el código existente. Consideremos (directamente desde el documento):
template<class A1> void f(A1 & a1)
{
std::cout << 1 << std::endl;
}
void f(long const &)
{
std::cout << 2 << std::endl;
}
int main()
{
f(5); // prints 2 under the current rules, 1 after the change
int const n(5);
f(n); // 1 in both cases
}
O
// helper function in a header
template<class T> void something(T & t) // #1
{
t.something();
}
// source
#include <vector>
void something(bool) // #2
{
}
int main()
{
std::vector<bool> v(5);
// resolves to #2 under the current rules, #1 after the change
something(v[0]);
}
Esto también se abstiene de comunicar la categoría de valor (valor-I o rvalue), que no es un gran problema en C++ 03 . Pero dado que esta corrección solo se podía hacer durante C++ 0x, nos desconectaríamos efectivamente de las referencias rvalue al reenviar (algo malo). Deberíamos esforzarnos por una mejor solución.
Sí, sé sobre la sobrecarga. Quería saber por qué es incluso necesario. ¿Cómo sería inconsistente? – Puppy
@DeadMG: '1' tiene tipo' int'. Si declara un 'int i = 1', entonces elegiría el enfoque no const, porque' i' no es const. Por lo tanto, para mayor coherencia, aquí también lo hace, excepto que para un valor r es un error. –
@ Matthieu: 1 es un valor int. yo soy un int lvalue Como el idioma insiste en tratarlos de manera diferente, entonces son cosas diferentes. Por lo tanto, no es inconsistente. De hecho, es incoherente tener un conjunto de reglas especialmente para los valores r, y luego tratar de tratarlos de la misma manera aquí. – Puppy