3
#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' を変換できません

4

2 に答える 2

7

vは return ステートメントの左辺値です (名前付き右辺値参照は安全上の理由から左辺値です) が、 の戻り値の型moveは右辺値参照です ( Tis ですint&が、参照を削除するためint &&、戻り値の型で型を形成します)。

名前のない右辺値参照を返す場合は、まず最初にstatic_castその右辺値参照vremove_reference<T>::type &&作成する必要があります。

あなたの目標が何であるかわかりません。使用したいstd::move(タイトルで言うように)か、実装方法を学びたい(表示するコードが示すように)。std::move基本的な C++ の規則を知らずに がどのように機能するかを学ぼうとしても意味がありません。C++ Books Listをご覧になることをお勧めします。C++ について十分に理解したら、どのようにstd::move動作するかを学習できます。

于 2011-04-03T13:49:36.510 に答える
4

これは、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);
}
于 2011-04-03T13:51:49.043 に答える