103

ないと思いますが、確認したいと思います。の用途はありますか? クラス型はconst Foo&&どこにありますか?Foo

4

5 に答える 5

89

それらは時々役に立ちます。ドラフト C++0x 自体は、いくつかの場所でそれらを使用しています。次に例を示します。

template <class T> void ref(const T&&) = delete;
template <class T> void cref(const T&&) = delete;

上記の 2 つのオーバーロードは、他の関数ref(T&)cref(const T&)関数が右辺値にバインドしないことを保証します (それ以外の場合は可能です)。

アップデート

残念ながら公開されていない公式標準N3290を確認したところ、20.8 関数オブジェクト [function.objects]/p2 に含まれています。

template <class T> void ref(const T&&) = delete;
template <class T> void cref(const T&&) = delete;

次に、公開されている最新のポスト C++ 11 ドラフトN3485を確認しましたが、20.8 Function objects [function.objects]/p2 ではまだ次のように書かれています。

template <class T> void ref(const T&&) = delete;
template <class T> void cref(const T&&) = delete;
于 2011-02-09T02:08:19.917 に答える
5

それらは許可され、 に基づいてランク付けされた関数でさえありconstますが、 によって参照される const オブジェクトから移動できないためconst Foo&&、それらは役に立ちません。

于 2011-02-08T21:58:46.670 に答える
2

これが直接役立つ状況は考えられませんが、間接的に使用される可能性があります。

template<class T>
void f(T const &x) {
  cout << "lvalue";
}
template<class T>
void f(T &&x) {
  cout << "rvalue";
}

template<class T>
void g(T &x) {
  f(T());
}

template<class T>
void h(T const &x) {
  g(x);
}

gの Tは T const なので、fの x は T const&& です。

これにより、 (オブジェクトを移動または使用しようとしたときに) fでコマイル エラーが発生する可能性がありますが、 fは、右辺値を変更せずに左辺値で呼び出すことができないように、右辺値参照を取ることができます (単純すぎる場合のように)。上記の例)。

于 2011-02-08T22:23:17.130 に答える