ないと思いますが、確認したいと思います。の用途はありますか? クラス型はconst Foo&&
どこにありますか?Foo
5 に答える
それらは時々役に立ちます。ドラフト 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;
それらは許可され、 に基づいてランク付けされた関数でさえありconst
ますが、 によって参照される const オブジェクトから移動できないためconst Foo&&
、それらは役に立ちません。
これが直接役立つ状況は考えられませんが、間接的に使用される可能性があります。
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は、右辺値を変更せずに左辺値で呼び出すことができないように、右辺値参照を取ることができます (単純すぎる場合のように)。上記の例)。