const参照、または右辺値の場合は右辺値参照のいずれかによって値を取得するために関数をオーバーロードするのに問題があります。問題は、私の非定数左辺値が関数の右辺値バージョンにバインドされていることです。私は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)
右辺値参照バージョンを次のように置き換えてみました
void foo(typename remove_reference<T>::type&& t)
しかし、これはすべてをconst-lvalue参照バージョンに解決させる効果しかありませんでした。
この動作を防ぐにはどうすればよいですか?そして、なぜこれがデフォルトなのか-右辺値参照の変更が許可されていることを考えると非常に危険なようです。これにより、予期せず変更されたローカル変数が残ります。
編集:関数の非テンプレートバージョンを追加しただけで、期待どおりに機能します。関数をテンプレートにすると、過負荷解決ルールが変更されますか?それは..本当にイライラします!
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>&&)