-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathisLvalue.cpp
69 lines (53 loc) · 2.12 KB
/
isLvalue.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
#include <utility>
#include <vector>
template <typename T>
constexpr bool isLvalue(T&) {
return true;
}
template <typename T>
constexpr bool isLvalue(T&&) {
return false;
}
void function() {}
struct MyClass{
int a{};
};
int returnByCopy() {
return 2011;
}
std::vector<int> myVec{1, 2, 3};
int& returnByLvalueReference() {
return myVec[0];
}
int&& returnByRvalueReference() {
return std::move(myVec[0]);
}
int main() {
std::cout << std::boolalpha;
std::cout << "---- Lvalues: \n\n";
int lvalue = 1998;
std::cout << "isLvalue(lvalue): " << isLvalue(lvalue) << '\n';
std::cout << "isLvalue(funcion): " << isLvalue(function) << '\n';
auto lambdaExpression = []{std::cout << "2011\n";};
std::cout << "isLvalue(lambdaExpression): " << isLvalue(lambdaExpression) << '\n';
MyClass myClass;
std::cout << "isLvalue(myClass): " << isLvalue(myClass) << '\n';
std::cout << "isLvalue(myClass.a): " << isLvalue(myClass.a) << '\n';
std::cout << "isLvalue(string_literal): " << isLvalue("string_literal") << '\n';
int* intPtr = &lvalue;
std::cout << "isLvalue(intPtr): " << isLvalue(intPtr) << '\n';
std::cout << "isLvalue(returnByLvalueReference()): " << isLvalue(returnByLvalueReference()) << '\n';
std::cout << '\n';
std::cout << "---- Rvalues: \n\n";
std::cout << "isLvalue(1998): " << isLvalue(1998) << '\n';
std::cout << "isLvalue(int{}): " << isLvalue(int{}) << '\n';
std::cout << "isLvalue(lvalue + 1998): " << isLvalue(lvalue + 1998) << '\n';
std::cout << "isLvalue([]{ return 2011; }): " << isLvalue([]{ return 2011; }) << '\n';
std::cout << "isLvalue(MyClass{}): " << isLvalue(MyClass{}) << '\n';
std::cout << "isLvalue(MyClass{}.a): " << isLvalue(MyClass{}.a) << '\n';
std::cout << "isLvalue(returnByCopy()): " << isLvalue(returnByCopy()) << '\n';
std::cout << "isLvalue(returnByRvalueReference()): " << isLvalue(returnByRvalueReference()) << '\n';
std::cout << "isLvalue(&lvalue): " << isLvalue(&lvalue) << '\n';
std::cout << "isLvalue(std::move(lvalue): " << isLvalue(std::move(lvalue)) << "\n";
}