タグ付けされた質問 「rvalue-reference」

4
C ++ 11でのT &&(二重アンパサンド)の意味は?
私はC ++ 11の新機能のいくつかを調査してきましたが、気付いたのは、変数の宣言における2つのアンパサンドT&& varです。 まず、この獣は何と呼ばれていますか?Googleがこのような句読点を検索できるようにしてほしい。 正確にはどういう意味ですか? 一見、それは(Cスタイルのダブルポインターのような)二重参照のように見えますが、T** varその使用例を考えるのに苦労しています。

6
フォワードを使用する利点
完全な転送でstd::forwardは、名前付き右辺値参照t1および名前なし右辺値参照への変換に使用されt2ます。それを行う目的は何ですか?&を左辺値のinnerままにすると、呼び出された関数にどのような影響がありますか?t1t2 template <typename T1, typename T2> void outer(T1&& t1, T2&& t2) { inner(std::forward<T1>(t1), std::forward<T2>(t2)); }

6
C ++ 11右辺値と移動の意味論の混乱(returnステートメント)
私は右辺値参照を理解し、C ++ 11のセマンティクスを移動しようとしています。 これらの例の違いは何ですか?それらのうちどれがベクターコピーを行わないでしょうか? 最初の例 std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> &&rval_ref = return_vector(); 2番目の例 std::vector<int>&& return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector(); 3番目の例 std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector();

6
ラムダでキャプチャを移動
C ++ 11ラムダで移動(右辺値参照とも呼ばれます)でキャプチャするにはどうすればよいですか? 私はこのようなものを書こうとしています: std::unique_ptr<int> myPointer(new int); std::function<void(void)> example = [std::move(myPointer)]{ *myPointer = 4; };



1
可変個関数のすべての引数でstd :: forwardをどのように呼び出しますか?
私は単に汎用オブジェクトファクトリを作成し、ブーストプリプロセッサメタライブラリを使用して可変テンプレートを作成していました(2010を使用していて、それらをサポートしていません)。私の関数はrval参照を使用std::forwardし、完全な転送を行うため、私は考えさせられました... C ++ 0Xが出て、標準のコンパイラーがあったとき、実際の可変テンプレートでこれを行います。それでも、私std::forwardは議論を呼びかけますか? template <typename ...Params> void f(Params... params) // how do I say these are rvalue reference? { y(std::forward(...params)); //? - I doubt this would work. } 私が考えることができる唯一の方法は... paramsを手動で解凍することを必要とするでしょう、そして私はまだそこにもまだありません。機能するより速い構文はありますか?

1
指定されたテンプレートパラメータを持つC ++ 11make_pairはコンパイルされません
-std = c ++ 11を有効にしてg ++ 4.7(後のスナップショットの1つ)で遊んでいました。私は既存のコードベースのいくつかをコンパイルしようとしましたが、失敗した1つのケースはやや混乱します。 誰かが何が起こっているのか説明していただければ幸いです。 コードは次のとおりです。 #include <utility> #include <iostream> #include <vector> #include <string> int main ( ) { std::string s = "abc"; // 1 ok std::pair < std::string, int > a = std::make_pair ( s, 7 ); // 2 error on the next line std::pair < …

3
ラムダクロージャの左辺値を右辺値参照パラメータとして渡すことができます
lvalueラムダクロージャーは常にrvalue関数パラメーターとして渡すことができることがわかりました。 次の簡単なデモをご覧ください。 #include <iostream> #include <functional> using namespace std; void foo(std::function<void()>&& t) { } int main() { // Case 1: passing a `lvalue` closure auto fn1 = []{}; foo(fn1); // works // Case 2: passing a `lvalue` function object std::function<void()> fn2 = []{}; foo(fn2); // compile error return 0; } …

2
ここで列挙型変数が右辺値になるのはなぜですか?
例: typedef enum Color { RED, GREEN, BLUE } Color; void func(unsigned int& num) { num++; } int main() { Color clr = RED; func(clr); return 0; } これをコンパイルすると、次のエラーが発生します。 <source>: In function 'int main()': <source>:16:9: error: cannot bind non-const lvalue reference of type 'unsigned int&' to an rvalue of type …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.