8

右辺値参照パラメーターを受け入れる関数を定義すると、次のようになります。

template <typename T>
void fooT(T &&x) {}

GCC 4.5 を使用してa、 、ar、またはのいずれかで呼び出すことができarrます。

int a, &ar = a, &&arr = 7;
fooT(a); fooT(ar); fooT(arr);

ただし、同様の非テンプレート関数を呼び出すと、

void fooInt(int &&x) {}

これら 3 つの引数のいずれを使用しても失敗します。の知識を強化する準備をしていたのforwardですが、これでコースから外れてしまいました。おそらくそれは GCC 4.5 です。A Brief Introduction to Rvalue Referencesの最初の例でもコンパイル エラーが発生することに驚きました。

A a;
A&& a_ref2 = a;  // an rvalue reference
4

2 に答える 2

12

テンプレート パラメーターでの推論の動作は独特であり、それがテンプレート バージョンが機能する理由です。別の質問のコンテキストで、この控除がここでどのように機能するかを正確に説明しました。

要約: 引数が左辺値の場合、Tに推定されT&、 にT& &&折りたたまれT&ます。パラメータ at を使用するとT&、それに左辺値を指定することは完全に有効ですT。それ以外の場合は のTままTで、パラメーターはT&&であり、右辺値引数を受け入れます。

逆に、int&&常にint&&(別のものに強制するためのテンプレート演繹規則はありません) であり、右辺値にのみバインドできます。

于 2011-04-03T21:13:27.970 に答える
7

GMan の正しい答えに加えて、右辺値参照の簡単な紹介には、非合法化された言語変更の前に書かれたため、間違った例があります。

A a;
A&& a_ref2 = a;  // an rvalue reference (DISALLOWED in C++11)

この言語の変更にもかかわらず、この記事で説明されている主なユース ケース (移動と転送) は、記事で正しく説明されています。

更新: ああ、同じ記事が最初にここに公開されましたが、(imho) わずかに書式設定が改善されています。

于 2011-04-03T21:18:50.357 に答える