Ответ 1
Это упоминается как потенциальное решение в документе, который я связал в недавнем C + + 0x вопрос пересылки.
Это будет работать достаточно хорошо, но это сломает существующий код. Рассмотрим (прямо из документа):
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
}
или
// 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]);
}
Это также не позволяет переслать категорию значений (lvalue или rvalue), что не является большой проблемой в С++ 03. Но так как это исправление можно было сделать только во время С++ 0x, мы фактически закрыли бы себя из ссылок rvalue при пересылке (плохая вещь). Мы должны стремиться к лучшему решению.