#include <type_traits>
template<class T>
typename std::remove_reference<T>::type&& move(T&& v)
{
return v;
}
void main()
{
int a;
move(a);
}
このコードがコンパイルされないのはなぜですか?
エラー C2440: 'return': 'int &&' の 'int' を変換できません
#include <type_traits>
template<class T>
typename std::remove_reference<T>::type&& move(T&& v)
{
return v;
}
void main()
{
int a;
move(a);
}
このコードがコンパイルされないのはなぜですか?
エラー C2440: 'return': 'int &&' の 'int' を変換できません
v
は return ステートメントの左辺値です (名前付き右辺値参照は安全上の理由から左辺値です) が、 の戻り値の型move
は右辺値参照です ( T
is ですint&
が、参照を削除するためint &&
、戻り値の型で型を形成します)。
名前のない右辺値参照を返す場合は、まず最初にstatic_cast
その右辺値参照v
をremove_reference<T>::type &&
作成する必要があります。
あなたの目標が何であるかわかりません。使用したいstd::move
(タイトルで言うように)か、実装方法を学びたい(表示するコードが示すように)。std::move
基本的な C++ の規則を知らずに がどのように機能するかを学ぼうとしても意味がありません。C++ Books Listをご覧になることをお勧めします。C++ について十分に理解したら、どのようにstd::move
動作するかを学習できます。
これは、C++0x ドラフト標準 (§20.2.3/6) からそのままです。
template <class T> typename remove_reference<T>::type&& move(T&& t) noexcept;
戻り値:
static_cast<typename remove_reference<T>::type&&>(t)
.
したがって、move
実装を次のように変更すると、問題なく動作します。
template<class T>
typename std::remove_reference<T>::type&& move(T&& v)
{
return static_cast<typename std::remove_reference<T>::type&&>(v);
}