In early June, the meeting of the WG21 international working group on C ++ standardization ended in the city of Rapperswil-Yona.

This is what awaits you under the cut:
- Contracts and Friends
- Concepts (without friends)
- __has_cpp_attribute (unlikely)
- bit_cast <my_stuff> (some_array)
- contains , shift_left , shift_right , ispow2 , ceil2 ... and the old algorithms under the new sauce
- atomic_ref
- What new can be written in the templates and how it is useful
- constexpr virtual foo ()
- Parallelism 2, Reflection and Executors TS
There will also be a bonus: a mini section for experts:
- user-declared virtual destructor does not affect the triviality of the type
- Where you can shove an exclamation mark and how it can be useful
- constexpr std :: regex mail_regex (R "((?: (?: [^ <> () \ [\].,;: \ s @ \"] + (?: \. [^ <> () \ [ \].,;: \ s @ \ "] +) *) | \". + \ ") @ (?: (?: [^ <> () \ [\].,;: \ s @ \" ] + \.) + [^ <> () \ [\].,;: \ s @ \ "] {2,}))")
Contracts
In C ++, 20 have accepted contracts. So, you can soon forget about the use of macros for asserts, get the best documentation out of the box and even notice the performance gain. Contracts look like in practice:
std::string get_name_by_login(std::string_view login)
[[expects: !login.empty() ]]
[[ensures ret_value: !ret_value.empty() ]]
;
, , . , :
- ( ) .
- ( ) . , , .
- (, doxygen) / .
- , (, ).
.
21 Fails, . , :
void(const std::contract_violation & e) noexcept {
std::cerr << "Contract violated in function " << e.function_name() << '\n'
<< std::stacktrace();
}
:
Contract violated in function std::array<T, N>::operator[](size_type) [with T = int; long unsigned int N = 5ul; ]':
0# std::array<int, 5ul>::operator[](unsigned long) at /usr/include/c++/array:124
1# bar(int) at ../example/assert_handler.cpp:17
2# foo(int) at ../example/assert_handler.cpp:25
3# main at ../example/assert_handler.cpp:54
4# 0x00007F991FD69F45 in /lib/x86_64-linux-gnu/libc.so.6
5# 0x0000000000401139
}
std::stacktrace C++20, design review LEWG, LWG.
.
, Ranges TS. compile-time :
template <class F>
requires Invocable<F>
void my_executor::execute(F f) noexcept {
lock_guard l{data_mutex_};
push(std::move(f));
}
proposal.
Feature-test macros
. .
unlikely,
__has_cpp_attribute(unlikely).
,
.
bit_cast
reinterpret_cast – . , . C++ .
,
my_type my = reinterpret_cast<my_type&>(some_array);
my_type my = std::bit_cast<my_type>(some_array);
, some_array my_type , , . , type aliasing.
, C++20:
- shift_left(it_begin, it_end, unsigned n) – n, *it_begin = std::move(*(it_begin + n)), *(it_begin + 1) = std::move(*(it_begin + n + 1))...
- shift_right(it_begin, it_end, unsigned n) – , , *(it_begin + n) = std::move(*it_begin), *(it_begin + n + 1) = std::move(*(it_begin + 1))...
- ispow2(x) – true ,
- ceil2(x) – ,
- contains – bool contains(const key& v), true
, ,
std::swap std::swap constexpr. ,
std::nth_element .
21.
atomic_ref
, - ? atomic_ref<T> (
).
, ,
atomic_ref<T>.
atomic_ref,
atomic_ref, .
, (string
_view, atomic
_ref),
. , .
X,
operator<=> :
struct X {
// ...
std::strong_equality operator<=>(const X&, const X&) = default;
// ...
};
:
template <X x>
struct x_as_template_param {
// ...
};
operator<=>.
constexpr virtual
, , constexpr .
constexpr virtual int foo();,
int foo() constexpr, .
foo() , constexpr .
, ,
std::type_info,
Boost.TypeIndex, compile-time :
template <class T, class U>
constexpr bool is_same() {
constexpr bool res = (typeid(T) == typeid(U));
return res;
}
.
Parallelism 2, Reflection Executors TS
Parallelism 2 ,
. type traits, simd .
Reflection (TS). ,
<type_traits>. constexpr
constexpr! (. ).
Executors C++20, , , TS. , .
user-declared virtual destructor
, C++20 ( ), , :
struct i_am_trivial {
int foo;
char bar;
virtual ~i_am_trivial() = default;
};
, , . , , , , . , ,
std::vector<Base>, Base .
constexpr!
, C++20 –
constexpr! .
, runtime . C++.
constexpr! . ..
constexpr! , ( ) . , . , ,
Boost.Hana [Boost.]PFR.
: constexpr std::regex
/ . , , .
C++ :
bool is_valid_mail(std::string_view mail) {
static const std::regex mail_regex(R"((?:(?:[^<>()\[\].,;:\s@\"]+(?:\.[^<>()\[\].,;:\s@\"]+)*)|\".+\")@(?:(?:[^<>()\[\].,;:\s@\"]+\.)+[^<>()\[\].,;:\s@\"]{2,}))");
return std::regex_match(
std::cbegin(mail),
std::cend(mail),
mail_regex
);
}
is_valid_mail(). , .
constexpr (constexpr new, is_constexpr_evaluated() .) C++ ,
constexpr std::regex.
constexpr std::regex is_valid_mail() . , GCC
static const, .. GCC-6
constexpr – , GCC .
,
constexpr std::regex?
P.S.: C++ Yandex.Taxi Coding Fest. C++17.