What and Why 这次单独说一下 std::exchange,它是 C++14 <utility> 提供的一个函数模板,实现很简单。 template<class T, class U = T> constexpr // since C++20 T exchange(T& obj, U&& new_value) noexcept( // since C++23 std::is_nothrow_move_constructible<T>::value && std::is_nothrow_assignable<T&, U>::value ) { T old_value = std::move(obj); obj = std::forward<U>(new_value); return old_value; } 看实现可知其逻辑很简单,就是设置新值、返回旧值。但却难以顾名思义,它实际上并不会交换数据,那得这样写: y = std::exchange(x, y); 上篇说过,std::exchange 和… Continue Reading std::exchange use cases

今天讲一个 Idiom 加一些 Tricks。 本次内容紧紧围绕着 The Rule of the Big Five,即 destructor copy constructor copy assignment constructor move constructor move assignment constructor 要讲的 Idiom 主要是针对后三个,Tricks 则主要是针对后两个,属于是一些额外的优化技巧。 先从 The Big 3 说起,就是前三个,由此引出 Idiom 存在的必要性。一个小例子: class my_string { public: // default ctor my_string(const char* str = "") : size_ { std::strlen(str) }… Continue Reading T230723 copy-and-swap Idiom and More Tricks

今天说两个关于编译期的小技巧。 看如下例子: struct S { int val; constexpr int size() const { return val * (val + 1) / 2; } }; constexpr auto bad(S s) { // doesn't compile return std::array<int, s.size()>{}; } int main() { constexpr S s{42}; auto my_array = bad(s); } 这里 bad() 的参数 s 就称为… Continue Reading T230420 Unconditional compile-time expression