C++0 x右、move、forward、参照劣化


昨日また右の値、moveとforwardを勉強しました.学習したことを記録します.
1、引用退化
左の値は伝染性を参照しています.左参照の右参照または右参照の左参照結果は、次のいずれかです.
string&&&とstring&&&&はstring&に等しい
string&&stringに等しい&
string&&&はstring&&に等しい
2、左と右は式の属性です
すなわち,ある変数のタイプは右値参照であるが,変数自身が構成する式は左値である.
3、具名の左値参照と右値参照はいずれも左値であり、無名の右値参照は右値である
名前付き変数は、左値でも右値でも明示的に宣言されていない場合、デフォルトではすぐに破棄されないため、右値として見ることはできません.
4、move
左参照でも右参照でもmoveで右参照に変更
5、forward
std::forward(x)
Tがstringであればstring&&;Tがstring&であればstring&を返します.戻りタイプとxタイプは関係ありません
では、なぜ完璧な転送と呼ばれているのでしょうか.xが左引用なのか右引用なのかは関係ありません!!
肝心なのは,このTが固定的ではなく,コンパイラによって関数パラメータ上のタイプから導出されることである.
template 
T&& func(T&& x)
{
    return std::forward(x);
}

string&でfuncを呼び出すと,Tのタイプはstring&となる.参照が劣化するため、T&&はstring&に等価であるため、戻り値も左値string&である.
string&&でfuncを呼び出すと,Tのタイプはstringとして導出される.したがって、戻り値はstring&&&.
完璧な転送を実現しました.
そのためfowardの完璧な転送は必ずテンプレートパラメータと自動的に導出して関連付けて使用しなければならず,単独forward自身では完璧な転送はできない.
6、右の値を関数パラメータとして従来の関数を最適化する
一般的には、func(const X&data)などの関数をリロードして最適化します.
func(X&& data)
実パラメータがX&、const X&、const X&&&である場合、古い関数が呼び出されます.一方、実パラメータがX&&である場合、パフォーマンスの向上のために新しい関数が呼び出されます.
7、デフォルトタイプ変換
Type&&&はデフォルトでType&、const Type&、const Type&&に変更できます.その制約が一番強いからです.コンストレイントには次のものが含まれます.
a)合法的な対象を指す
b)修正可能
c)その対象はすぐに破棄され、データを盗むことができる
一方Type&はa)、b)の2つの制約のみを含む
const Type&&はデフォルトでconst Type&に変更できます.
Type&はデフォルトでconst Type&にしか変換できません.Type&&&に変換するにはstd::moveを使用します.
const Type&は他の3つのタイプに変換できません
8、const Type&&存在意義ない
すぐに廃棄されますが、まだ修正されていません.図は何ですか.