C++ features by examples
11.cpp
Go to the documentation of this file.
1
14static_assert(__cplusplus == 201103, "");
15
16#include <signal.h>
17#include <unistd.h>
18#include <bits/stdc++.h>
19
20#if __has_include (<version>)
21#include <version>
22#endif
23
24using namespace std;
25
33{
34 static_assert(__cpp_decltype, "");
35
36 int a;
37 // https://en.cppreference.com/w/cpp/header/type_traits
38 decltype(a) b; // https://en.cppreference.com/w/cpp/language/decltype
39
40 assert((is_same<decltype(a), decltype(b)>::value));
41 assert((!is_same<decltype(a), unsigned>::value));
42 assert((is_same<int, int32_t>::value));
43 assert((is_same<signed, int32_t>::value));
44
45 assert(is_integral<int>::value);
46 assert(is_integral<bool>::value);
47 assert(!is_integral<float>::value);
48 assert(is_pointer<int*>::value);
49 assert(sizeof (long long) >= 8);
50}
51
53
55{
56 int d = 0;
57 unique_ptr<int> u1;
58 assert(!u1);
59 u1.reset(&d);
60 assert(u1);
61 *u1 = 1;
62 assert(d == 1);
63
64 unique_ptr<int> u2;
65 // u2 = u1; - prohibited
66
67 int * p1 = u1.get();
68 u2 = move(u1); // [move](https://en.cppreference.com/w/cpp/utility/move)
69 assert(u2.get() == p1);
70 assert(u2);
71 assert(!u1);
72 assert(u2.get() == &d);
73 // must release because d is local
74 u2.release();
75 u2.reset(new int(10));
76 assert(*u2 == 10);
77
78 u2.reset(); // deletes int(10)
79 assert(u2 == nullptr); // [nullptr](https://en.cppreference.com/w/cpp/language/nullptr)
80
81 assert(!u2);
82}
83
85
87{
88 shared_ptr<int> s1;
89 assert(!s1);
90 assert(!s1.use_count());
91
92 auto s2 = make_shared<int>(1);
93 assert(s2.use_count() == 1);
94
95 s1 = s2;
96 assert(s1.use_count() == 2);
97
98 *s1 = 2;
99 assert(*s1 == *s1.get());
100 assert(*s2 == 2);
101
102 s2 = nullptr; // like s2.reset();
103 assert(s1.use_count() == 1);
104 assert(!s2.use_count());
105}
106
108
110{
111 std::weak_ptr<int> wp;
112
113 assert(!wp.lock());
114 assert(!wp.use_count());
115 auto sp = std::make_shared<int>(1);
116 wp = sp;
117 assert(*wp.lock() == 1);
118}
119
127{
128 auto a = new int[3] {1, 2, 3};
129 assert(a[2] == 3);
130 delete[] a;
131
132 auto as = new string[3] {"1", "2", "3"};
133 assert(as[2] == "3");
134 delete[] as; // calls destructors for all members
135
137
139
140 weak_pointer();
141}
142
145
146char func_type(const int& x)
147{
148 assert(is_const<typename remove_reference<decltype(x)>::type>::value);
149 assert(is_lvalue_reference<decltype(x)>::value);
150 return 'C';
151}
152
153char func_type(int& x)
154{
155 assert(is_lvalue_reference<decltype(x)>::value);
156 return 'L';
157}
158
159char func_type(int&& x)
160{
161 assert(is_rvalue_reference<decltype(x)>::value);
162 return 'R';
163}
164
166
167template<class T>
168char func_type_template(T&& x) // x is a forwarding reference
169{
170 // x is not R-value here
171 assert(func_type(x) != 'R');