C ++二重アドレス演算子?(&&)


137

私はSTLソースコードを読んでいて、&&アドレス演算子が何をすることになっているのか分かりません。これはからのコード例ですstl_vector.h

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

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


2
多分それは参照のアドレスです。
Gabe

1
@Gabe; これは宣言なので、参照への参照になりますが、参照自体は変更できないため、意味がありません。address-ofはコード内でのみ使用でき、宣言時(この場合のパラメーターなど)には使用できません。このようなものを見たことはありません。
falstro

5
が1つしかなかったとしても&、それはアドレス演算子とは何の関係もありませんが、代わりにそれ__xが参照であることを示します。
sepp2k 2010

回答:



175

&&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.
}

参考になれば幸いです。


11
追加したい唯一の例は、これがstd :: moveでどのように機能するかです。int&& c = std::move( b );などで何が起こるかを示す
Zzzach ...

2
Sravani Sが 2018年2月15日、TutorialsPointのためにここから露骨に盗用したようです
ガブリエルステープルズ



34

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

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

それはかなり複雑なトピックです-最良の紹介の1つ(これは単なるおおざっぱなものではありません)は、Stephan T. Lavavejによる記事、「Rvalue References:C ++ 0x Features in VC10、Part 2」です。

記事はまだかなり重いですが、価値があります。また、Microsoft VC ++ブログに掲載されていますが、すべて(またはほぼすべて)の情報は、どのC ++ 0xコンパイラにも適用できます。


&&トークン自体は新しいものではありません。宣言におけるその意味は次のとおりです。しかし、あなたはそれを知っていました。
aschepler 2010

これはこの文脈では新しいことです。しかし、C / C ++がトークンをオーバーロードして、異なるコンテキストで異なる意味を持つことは非常に伝統的です。
マーティンヨーク

1
@aschkleper-もちろん...論理演算子は私の心にさえ入りませんでした。答えを更新します。
Michael Burr

5

それは移動演算子だと思います。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
他の回答でまだカバーされていないこの4年前の質問にあなたの答えは何ですか?
仮面の男14

5
私はこのような答えに気づかなかったので、追加することにしました。私はちょうど今日グーグルでこの質問に出くわしました。
yash101 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.