คำถามติดแท็ก rvalue-reference

4
T&& (เครื่องหมายคู่คู่) หมายถึงอะไรใน C ++ 11
ฉันได้รับการมองเข้าไปในบางส่วนของคุณสมบัติใหม่ของ C ++ 11 T&& varและเป็นหนึ่งฉันได้สังเกตเห็นเป็นเครื่องหมายคู่ในตัวแปรประกาศเช่น สำหรับการเริ่มต้นสัตว์ร้ายตัวนี้เรียกว่าอะไร? ฉันต้องการให้ Google อนุญาตให้เราค้นหาเครื่องหมายวรรคตอนเช่นนี้ มันหมายความว่าอะไรกันแน่? จากภาพรวมในครั้งแรกดูเหมือนว่าจะเป็นการอ้างอิงสองครั้ง (เช่นตัวชี้ดับเบิลแบบ C T** var) แต่ฉันมีความลำบากในการนึกถึงกรณีการใช้งานสำหรับสิ่งนั้น

6
อะไรคือวัตถุประสงค์หลักของการใช้ std :: forward และปัญหาอะไรที่แก้ได้?
ในการส่งต่อที่สมบูรณ์แบบstd::forwardใช้เพื่อแปลงการอ้างอิง rvalue ที่ระบุชื่อt1และt2การอ้างอิง rvalue ที่ไม่มีชื่อ จุดประสงค์ของการทำเช่นนั้นคืออะไร? สิ่งนั้นจะส่งผลกระทบต่อฟังก์ชั่นที่ถูกเรียกหรือไม่innerถ้าเราปล่อยให้t1& t2เป็นค่า? template <typename T1, typename T2> void outer(T1&& t1, T2&& t2) { inner(std::forward<T1>(t1), std::forward<T2>(t2)); }

6
C ++ 11 rvalues ​​และย้ายความสับสนของซีแมนทิกส์ (คำสั่ง 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(); ตัวอย่างที่สอง 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(); ตัวอย่างที่สาม 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
ย้ายการจับในแลมบ์ดา
ฉันจะจับภาพด้วยการย้าย (หรือที่รู้จักกันว่าการอ้างอิง rvalue) ในแลมบ์ดา C ++ 11 ได้อย่างไร ฉันกำลังพยายามเขียนสิ่งนี้: std::unique_ptr<int> myPointer(new int); std::function<void(void)> example = [std::move(myPointer)]{ *myPointer = 4; };



1
หนึ่งจะเรียก std :: ส่งต่ออาร์กิวเมนต์ทั้งหมดในฟังก์ชันตัวแปรได้อย่างไร
ฉันแค่เขียนโรงงานออบเจ็กต์ทั่วไปและใช้เมตาไลบรารีของตัวประมวลผลก่อนเร่งความเร็วเพื่อสร้างเทมเพลตแบบต่างๆ (ใช้ 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 ++ 11 make_pair พร้อมพารามิเตอร์เทมเพลตที่ระบุจะไม่คอมไพล์
ฉันเพิ่งเล่นกับ g ++ 4.7 (หนึ่งในสแน็ปช็อตในภายหลัง) ที่เปิดใช้งาน -std = c ++ 11 ฉันพยายามรวบรวมฐานรหัสที่มีอยู่บางส่วนและมีกรณีหนึ่งที่ล้มเหลวค่อนข้างทำให้ฉันสับสน ฉันจะขอบคุณถ้ามีใครสามารถอธิบายสิ่งที่เกิดขึ้นได้ นี่คือรหัส: #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 …

3
ค่าปิดของแลมบ์ดาสามารถส่งผ่านเป็นพารามิเตอร์อ้างอิง rvalue ได้
ฉันพบว่าการ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
เหตุใดตัวแปร enum จึงเป็นค่าที่นี่
ตัวอย่าง: 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.