C++ 中文周刊 第61期

reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态

周刊项目地址在线地址知乎专栏 腾讯云+社区

欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue


资讯

标准委员会动态/ide/编译器信息放在这里

编译器信息最新动态推荐关注hellogcc公众号 本周更新 2022-05-04 第148期

GCC 12.1 Released

文章

#define FWD(...) static_cast<decltype(__VA_ARGS__)&&>(__VA_ARGS__)

[[nodiscard]] constexpr auto bind_back(const auto& func, auto... bound_args) {
    return [=] [[nodiscard]] (auto&&... unbound_args) {
        return func(FWD(unbound_args)..., bound_args...);
    };
}

int main() {
  //std::cout << std::bind_front(std::divides{}, 2.)(1.); // prints 2
  std::cout << std::bind_back (std::divides{}, 2.)(1.); // prints 0.5
}

range代码更干净

#include <algorithm>
#include <vector>
#include <iostream>
#include <ranges>   // new header!

int main() {
    const std::vector numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    auto even = [](int i) { return 0 == i % 2; };
 
    std::ranges::reverse_view rv{ 
        std::ranges::drop_view { 
            std::ranges::filter_view{ numbers, even }, 1 
        }
    };
    for (auto& i : rv)
        std::cout << i << ' ';;                                 
}

一般都是多版本不兼容的问题

windows环境,代码我就不贴了

对比各种测试工具查内存报错,测试报告 valgrind效果非常好

uClibc有bug,尽快升级。否则会被DNS污染

介绍std::is_standard_layout

#include <iostream>
#include <type_traits>

class A {
  int a;
  int b;
};


class C {
  C (int& ib) : b(ib) {}
  int a;
  int& b;
};


int main() {
  std::cout << std::boolalpha;
  std::cout << std::is_standard_layout_v<A> << '\n';
  std::cout << std::is_standard_layout_v<C> << '\n';
}
template<typename T>
constexpr T winrt_empty_value() noexcept
{
    if constexpr (std::is_base_of_v<winrt::Windows::Foundation::IUnknown, T>) {
        return nullptr;
    } else {
        return {};
    }
}

Virtual­Protect使用问题

视频

不要用const T做返回值的声明,会破坏move

struct S;
const S foo(); // bad

返回临时变量,临时变量不要用 const T,会破坏copy elision

struct S;
S foo() {
  const S s1;
  const S s2;
  if (/*some condition */) {
  	return s1;
  } else {
  	return s2;
  }
}

如果要在传进来的参数上改动返回,没必要const T

struct S;
S foo(const S s) {
	// do sth with s
  return s;
}

以及不要const 成员,先确定你的类是不是需要拷贝/move,如果是单例模式没啥问题,如果需要,别const成员

struct S {
 const int a;
}

开源项目需要人手

新项目介绍/版本更新


本文永久链接

看到这里或许你有建议或者疑问或者指出错误,请留言评论! 多谢! 你的评论非常重要!也可以帮忙点赞收藏转发!多谢支持! 觉得写的不错那就给点吧, 在线乞讨 微信转账