У меня возникли проблемы с перегрузкой функции, чтобы получить значение либо с помощью ссылки const, либо, если это rvalue, ссылка rvalue. Проблема в том, что мои не-const lvalues являются обязательными для версии функции rvalue. Я делаю это в VC2010.
#include <iostream>
#include <vector>
using namespace std;
template <class T>
void foo(const T& t)
{cout << "void foo(const T&)" << endl;}
template <class T>
void foo(T&& t)
{cout << "void foo(T&&)" << endl;}
int main()
{
vector<int> x;
foo(x); // void foo(T&&) ?????
foo(vector<int>()); // void foo(T&&)
}
Приоритет заключается в том, чтобы вывести foo (x) как
foo< vector<int> & >(vector<int>& && t)
вместо
foo< vector<int> >(const vector<int>& t)
Я попытался заменить версию rvalue-reference на
void foo(typename remove_reference<T>::type&& t)
но это только привело к тому, что все было разрешено для ссылочной версии const-lvalue.
Как предотвратить это поведение? И почему это так по умолчанию - кажется настолько опасным, что разрешено изменять значения rvalue, это оставляет меня с неожиданно измененной локальной переменной.
EDIT: просто добавлены версии без шаблонов функций, и они работают должным образом. Создание функции шаблона изменяет правила разрешения перегрузки? Это... действительно расстраивает!
void bar(const vector<int>& t)
{cout << "void bar(const vector<int>&)" << endl;}
void bar(vector<int>&& t)
{cout << "void bar(vector<int>&&)" << endl;}
bar(x); // void bar(const vector<int>&)
bar(vector<int>()); // void bar(vector<int>&&)