C ++ 20 on the way! Meeting at Rapperswil-Yona

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:

There will also be a bonus: a mini section for experts:



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() ]]
;

, , . , :


.

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:


, , 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.

Source: https://habr.com/ru/post/413719/


All Articles