ครั้งแรกที่สเปคก็คือว่ามันจะกลับมามีค่าน้อยกว่าเท่ากับหรือมากกว่า0ไม่จำเป็นหรือ-1 1ประการที่สองค่าที่ส่งคืนเป็นค่า rvalues ขึ้นอยู่กับการส่งเสริมการขายดังนั้นจึงไม่มีจุดที่จะส่งคืนสิ่งที่น้อยกว่า
ใน C ++ (เช่นเดียวกับ C) ทุกนิพจน์จะเป็น rvalue หรือ lvalue ในอดีตคำศัพท์หมายถึงความจริงที่ว่า lvalues ปรากฏทางด้านซ้ายของงานโดยที่ rvalues จะปรากฏทางด้านขวาเท่านั้น วันนี้การประมาณอย่างง่ายสำหรับประเภทที่ไม่ใช่คลาสคือ lvalue มีที่อยู่ในหน่วยความจำ rvalue ไม่มี ดังนั้นคุณจึงไม่สามารถใช้ที่อยู่ของ rvalue ได้และไม่สามารถใช้ cv-qualifiers (ซึ่งเงื่อนไข "เข้าถึง") ในแง่ของ C ++ ค่า rvalue ที่ไม่มีประเภทคลาสเป็นค่าบริสุทธิ์ไม่ใช่วัตถุ ค่าที่ส่งคืนของฟังก์ชันคือค่า r เว้นแต่จะมีชนิดอ้างอิง (ประเภทที่ไม่ใช่คลาสที่พอดีกับรีจิสเตอร์มักจะถูกส่งคืนในรีจิสเตอร์เช่นแทนที่จะอยู่ในหน่วยความจำ)
สำหรับประเภทคลาสปัญหาจะซับซ้อนกว่าเล็กน้อยเนื่องจากคุณสามารถเรียกใช้ฟังก์ชันสมาชิกใน rvalue ได้ ซึ่งหมายความว่าในความเป็นจริง rvalues จะต้องมีแอดเดรสสำหรับthis
ตัวชี้และสามารถเป็น cv ที่ผ่านการรับรองได้เนื่องจากคุณสมบัติ cv มีบทบาทในการแก้ปัญหาโอเวอร์โหลด สุดท้าย C ++ 11 แนะนำความแตกต่างใหม่หลายประการเพื่อสนับสนุนการอ้างอิง rvalue สิ่งเหล่านี้ส่วนใหญ่ใช้ได้กับประเภทชั้นเรียน
โปรโมชั่น Integral หมายถึงความจริงที่ว่าเมื่อชนิดหนึ่งที่มีขนาดเล็กกว่าintที่ใช้เป็น rvalues intในการแสดงออกในบริบทส่วนใหญ่พวกเขาจะได้รับการเลื่อนตำแหน่งให้เป็น ดังนั้นแม้ว่าฉันจะมีการประกาศตัวแปรshort a, b;ในนิพจน์a
+ bทั้งสองaและbได้รับการเลื่อนขั้นเป็นintก่อนการเพิ่มจะเกิดขึ้น ในทำนองเดียวกันถ้าฉันเขียนa < 0การเปรียบเทียบจะกระทำกับค่าของaแปลงเป็นintไฟล์. ในทางปฏิบัติมีไม่กี่กรณีที่สิ่งนี้สร้างความแตกต่างอย่างน้อยก็ในเครื่อง 2's ที่เติมเต็มเลขคณิตจำนวนเต็ม (เช่นทั้งหมด แต่มี exotics น้อยมากในปัจจุบัน - ฉันคิดว่าเมนเฟรม Unisys เป็นข้อยกเว้นเดียวที่เหลืออยู่) ถึงกระนั้นแม้ในเครื่องทั่วไป:
short a = 1;
std::cout << sizeof( a ) << std::endl;
std::cout << sizeof( a + 0 ) << std::endl;
ควรให้ผลลัพธ์ที่แตกต่างกัน: ครั้งแรกเทียบเท่า
sizeof( short )กับที่สองsizeof( int )(เนื่องจากการส่งเสริมแบบอินทิกรัล)
ประเด็นทั้งสองนี้มีลักษณะตั้งฉากกันอย่างเป็นทางการ ค่า rvalues และ lvalues ไม่มีส่วนเกี่ยวข้องกับการส่งเสริมแบบอินทิกรัล ยกเว้น ... การส่งเสริมแบบอินทิกรัลใช้กับค่า rvalues เท่านั้นและกรณีส่วนใหญ่ (แต่ไม่ใช่ทั้งหมด) ที่คุณจะใช้ค่า rvalue จะส่งผลให้เกิดการส่งเสริมแบบรวม intด้วยเหตุนี้มีจริงๆเหตุผลที่จะกลับมาเป็นค่าตัวเลขในบางสิ่งบางอย่างมีขนาดเล็กกว่าไม่มี แม้จะมีเหตุผลที่ดีมากที่จะไม่ส่งคืนเป็นประเภทอักขระ ตัวดำเนินการที่โอเวอร์โหลด<<มักจะทำงานแตกต่างกันสำหรับประเภทอักขระดังนั้นคุณจึงต้องการส่งคืนอักขระเป็นประเภทอักขระเท่านั้น (คุณอาจเปรียบเทียบความแตกต่าง:
char f() { return 'a'; }
std::cout << f() << std::endl; // displays "a"
std::cout << f() + 0 << std::endl; // displays "97" on my machine
ความแตกต่างคือในกรณีที่สองการเพิ่มทำให้เกิดการส่งเสริมแบบอินทิกรัลซึ่งส่งผล<<ให้มีการเลือกโอเวอร์โหลดที่แตกต่างกัน