// lvalue references
const
int
& lvr1{ 42 };
// value
int
lv1{ 0 };
int
& lvr2{ lv1 };
// lvalue (non-const)
constexpr
int
lv2{ 42 };
const
int
& lvr3{ lv2 };
// lvalue (const)
constexpr
int
f1(
int
x)
{
return
6 * x;
}
const
int
& lvr4{ f1(7) };
// Function return value
// rvalue references
const
int
&& rvr1{ 42 };
// value
// Enable next two statements to reveal compiler error
#if 0
int
&& rvr2 {lv1};
// lvalue (non-const)
const
int
&& rvr3 {lv2};
// lvalue (const)
#else
int
&& rvr2{
static_cast
<
int
&&>(lv1) };
// rvalue (non-const)
const
int
&& rvr3{
static_cast
<
const
int
&&>(lv2) };
// rvalue (const)
#endif
const
int
&& rvr4{ f1(7) };
// Function return value
#include using namespace std; // §8.3.2 // References are either form of: // T& D lvalue reference // T&& D rvalue reference // They are distinct types (differentiating overloaded functions) // §8.5.3 // The initializer of an rvalue reference shall not be an lvalue // lvalue references const int & lvr1{ 42 }; // value int lv1{ 0 }; int & lvr2{ lv1 }; // lvalue (non-const) constexpr int lv2{ 42 }; const int & lvr3{ lv2 }; // lvalue (const) constexpr int f1( int x) { return 6 * x; } const int & lvr4{ f1(7) }; // Function return value const int & lvr5{ (lv1 + f1(7)) / 2 }; // expression // rvalue references const int && rvr1{ 42 }; // value // Enable next two statements to reveal compiler error #if 0 int && rvr2 {lv1}; // lvalue (non-const) const int && rvr3 {lv2}; // lvalue (const) #else int && rvr2{ static_cast < int &&>(lv1) }; // rvalue (non-const) const int && rvr3{ static_cast < const int &&>(lv2) }; // rvalue (const) #endif const int && rvr4{ f1(7) }; // Function return value const int && rvr5{ (lv1 + f1(7)) / 2 }; // expression int main() { lv1 = 42; // Print out the references cout << lvr1 << " Value" << endl; cout << lvr2 << " lvalue (non-const)" << endl; cout << lvr3 << " lvalue (const)" << endl; cout << lvr4 << " Function return value" << endl; cout << rvr1 << " Value" << endl; cout << rvr2 << " rvalue (const)" << endl; cout << rvr3 << " rvalue (non-const)" << endl; cout << rvr4 << " Function return value" << endl;
return 0; } |
Output:
42 Value 42 lvalue (non-const) 42 lvalue (const) 42 Function return value 42 Value 42 rvalue (const) 42 rvalue (non-const) 42 Function return value
No comments:
Post a Comment