C++11の右参照(一):左から右へ

6306 ワード

C++98には左値と右値の概念が規定されているが,一般プログラマーはC++98については左値と右値の区分は一般的にはあまり役に立たないが,C++11になるとその重要性が現れ始めた.
C++98標準は明確に規定する:
左はメモリアドレスを取得できる変数です.
左以外の値は右です.
ここから,実行&アドレス取得が可能なのは左値,その他は右値であることがわかる.
ここでは,与えられるかどうかがC++の左と右の区別ではないことを明確にする必要がある.
4つの式を示します.
string one("one");

const string two("two");

string three() { return "three"; }

const string four() { return "four"; }

ここでは4つの変数式で、後ろの2つは一時変数で、アドレスを取ることはできませんので、右の値に属し、前の2つは左の値です.
ここに関数を書きます.
void test(const string &s)

{

    cout << "test(const string &s):" << s << endl;

}

次にテストを行います.
test(one);

test(two);

test(three());

test(four());

コンパイルでは、このtestはすべての変数を受け入れることができることが分かった.
別の関数を使用してテストします.
void test(string &s)

{

    cout << "test(string &s):" << s << endl;

}

その後、テストでoneだけが呼び出すことができることが分かった.
2つのtest関数を同時に提供し、実行発見をコンパイルします.
test(string &s):one

test(const string &s):two

test(const string &s):three

test(const string &s):four

 
結論を出すことができます
C++ではconst X&はすべての変数を受け入れることができます
X&は通常変数のみ受け入れられます
同時に、C++リロード決議の特徴を見ることができます.
1つのパラメータが複数の関数に一致する場合、常に最も正確な1つに一致します.
たとえば上のoneではconst X&を受け入れることもできますが、X&形式のパラメータが存在する場合は、すぐに後者を選択します.明らかに後者は専門的に準備されており、両者の意味が最も合っている.X&にはoneと一致する修正意味が含まれています.
 
constプロパティの導入
 
上の4つの式は,左値と右値のみを議論し,constを加えて議論した.
したがって、
string one("one");    const  

const string two("two");   const  

string three() { return "three"; }  const  

const string four() { return "four"; } const  
        const    。
             ,         ?
     ,    X&      one,           const X&  ,                      ,                。
C++11              ,          :
void test(const string &s)

{

    cout << "test(const string &s):" << s << endl;

}



void test(string &s)

{

    cout << "test(string &s):" << s << endl;

}



void test(string &&s)

{

    cout << "test(string &&s):" << s << endl;

}



void test(const string &&s)

{

    cout << "test(const string &&s):" << s << endl;

}

C++11を使用してコンパイルしたところ、次のことがわかりました.
test(string &s):one

test(const string &s):two

test(string &&s):three

test(const string &&s):four

最適な一致が得られました.
 
X&非const左値の一致
const X&const左値の一致
X&&はconst以外の右値に一致します
const X&&マッチングconst右値
次に、各関数を使用してテストすると、次のことがわかります.
X&はconst以外の左の値にのみ一致し、これは前の結論と一致する.
const X&はすべての式に一致します
X&&はconst以外の右値にのみ一致します
const X&&はconstと非constの右の値を一致させることができます
OK、私たちの問題は解決して、私たちが右の値を区別する必要がある時、右の値の引用を使うことができます.
実際、const X&&&は一般的に必要ありませんので、次の3つのパラメータを使用します.
 
void test(string &s); 意味の変更
void test(string &&s); 移動の意味、後述
void test(const string &s); 定数の意味
この3つの意味は十分であり,C++98では修正と定数の意味のみを用い,C++11では移動の意味を実現するために右値を区別する必要があり,右値参照を導入する必要がある.
 
以下、C++11の右値参照による移動の意味を説明する.