У меня проблемы с перегрузкой функции для получения значения либо по константной ссылке, либо, если это rvalue, по ссылке 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)
Iпопытался заменить ссылочную версию rvalue на
void foo(typename remove_reference<T>::type&& t)
, но это только привело к тому, что все превратилось в эталонную версию const-lvalue.
Как предотвратить такое поведение?И в любом случае, почему это значение по умолчанию - это кажется настолько опасным, учитывая, что ссылки на rvalue разрешено изменять, и это оставляет меня с неожиданно измененной локальной переменной.
РЕДАКТИРОВАТЬ: Просто добавили не шаблонные версии функцийи они работают как положено.Делать функцию шаблоном изменяет правила разрешения перегрузки?Это .. действительно расстраивает!
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>&&)