web-dev-qa-db-ja.com

C ++ダブルアドレス演算子? (&&)

私はSTLソースコードを読んでいますが、&&アドレス演算子が何をすべきかわかりません。 stl_vector.hのコード例を次に示します。

vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
    // NB: DR 675.
    this->clear();
    this->swap(__x); 
    return *this;
}

「住所の住所」は意味がありますか?なぜ1つではなく2つのアドレス演算子があるのですか?

108
Anarki

これは C++ 11 コードです。 C++ 11では、&&トークンを使用して「右辺値参照」を意味できます。

94
aschepler

&&はC++ 11の新機能です。 int&& aは、「a」がr値参照であることを意味します。 &&は通常、関数のパラメーターを宣言するためにのみ使用されます。そして、それはのみはr値式を取ります。 r値がわからない場合、簡単な説明は、メモリアドレスがないということです。例えば。数字の6と文字「v」は両方ともr値です。 int a、aはl値ですが、(a+2)はr値です。例えば:

void foo(int&& a)
{
    //Some magical code...
}

int main()
{
    int b;
    foo(b); //Error. An rValue reference cannot be pointed to a lValue.
    foo(5); //Compiles with no error.
    foo(b+3); //Compiles with no error.

    int&& c = b; //Error. An rValue reference cannot be pointed to a lValue.
    int&& d = 5; //Compiles with no error.
}

それが有益であることを願っています。

119
Lexseal Lin

&&はC++ 11の新機能であり、関数が RValue-Reference -、つまり破棄されようとしている引数への参照を受け入れることを意味します。

81
Billy ONeal

他の回答が述べたように、このコンテキストの&&トークンはC++ 0x(次のC++標準)で新しく、「右辺値参照」を表します。

右辺値参照は、今後の標準で最も重要な新しいものの1つです。オブジェクトの「移動」セマンティクスのサポートを有効にし、関数呼び出しの完全な転送を許可します。

それはかなり複雑なトピックです-最高の紹介の1つ(単なる大雑把ではない)は、Stephan T. Lavavejによる記事 「Rvalue References:C++ 0x Features in VC10、Part 2」です。

この記事はまだ非常に読みやすいですが、価値があることに注意してください。また、Microsoft VC++ブログに掲載されていても、すべての(またはほぼすべての)情報はすべてのC++ 0xコンパイラに適用できます。

29
Michael Burr

私はそれが移動演算子であると信じています。 operator=は割り当て演算子で、たとえばvector x = vector yです。 clear()関数呼び出しは、メモリリークを防ぐためにベクターのコンテンツを削除しているように聞こえます。演算子は、新しいベクトルへのポインターを返します。

こちらです、

std::vector<int> a(100, 10);
std::vector<int> b = a;
for(unsigned int i = 0; i < b.size(); i++)
{
    std::cout << b[i] << ' ';
}

ベクトルaの値を指定したにもかかわらず、ベクトルbには値があります。それはoperator=()の魔法です!

MSDN-移動コンストラクターの作成方法

1
yash101