C++ 动态新闻推送 第57期

2022-04-11 08:09:01 浏览数 (1)

资讯

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

编译器信息最新动态 本周更新 第144期

安全问题报告

  • Chromium “Type confusion” 的bug影响QtWebEngine,请升级到Qt 5.15.9, Qt 6.2.5 or Qt 6.3.0.
  • zlib1.2.11 安全问题 CVE-2018-25032 which allows memory corruption when deflating (i.e., when compressing) if the input has many distant matches. 请使用到的尽快升级版本,qt的qCompress也受影响,如果使用,务必升级

文章

  • Did you know that C 20 added std::ranges::{all_of, any_of, none_of} algorithms?
代码语言:javascript复制
int main() {
  assert(std::ranges::all_of (std::array{1, 1, 1}, [](const auto& value) { return value == 1; }));
  assert(std::ranges::any_of (std::array{1, 2, 3}, [](const auto& value) { return value == 2; }));
  assert(std::ranges::none_of(std::array{1, 2, 3}, [](const auto& value) { return value == 4; }));
}

没啥说的,algorithm算法的range版本

  • go style协程设计

作者写了个库,很有意思

  • TCMalloc引起的 bad_alloc bug 记录

查bug要先看issue和release信息。不过tcmalloc有很多都替换成mimalloc和jemalloc了。

  • 拥抱xmake,Win C 编译新体验

xmake真的挺好用的。自己构建小东西,推荐使用

  • 技术简报(第三期)

赵工的这个整理挺不错的。会介绍一些系统知识

  • Use strong types instead of bool parameters

老生常谈了,bool语义不清晰,要是多个参数都是bool那可要了老命了,最好不要用 几种解决办法,用enum不同类型区分,或者写注释,多写注释

  • Fuzzy search for C Reference, Qt documentation and more from shell, Vim or Neovim

主要是使用zeal的cli工具嵌入,最近才知道zeal支持linux了。可以下载cpp的文档然后用zeal-cli来搜索,省一个搜索的功夫

  • Design Patterns VS Design Principles: Abstract Factory

介绍工厂模式怎么组织代码的。这里不展开了。

  • The std::invoke function does more than invoke functions
代码语言:javascript复制
struct S
{
    std::function<void()> do_something;
    int v;
};

S s;
s.do_something = []() { std::cout << "hello"; };

// does not print anything
std::invoke(&S::do_something, s);

为什么不打印???我明明调用了invoke

事实上得这么用

代码语言:javascript复制
std::invoke(&S::do_something, s)();

一旦理解了这种用法,代码就有了新的写法,面向invoke编程

代码语言:javascript复制
// Old and busted
this->dict.find(3)->second = "meow";

// New hotness
std::invoke(
    static_cast<std::map<int, std::string>::iterator
        (std::map<int, std::string>::*)(int const&)>(
        &std::map<int, std::string>::find),
        std::invoke(&MyClass::dict, this), 3)->second = "meow";

// Beyond hot
std::invoke(
    static_cast<std::string& (std::string::*)(char const*)>
        (&std::string::operator=), 
    std::invoke(&std::pair<int const, std::string>::second,
        std::invoke(
            static_cast<std::pair<int const, std::string>& (
                std::map<int, std::string>::iterator::*)() const noexcept>
                (&std::map<int, std::string>::iterator::operator*),
        std::invoke(
            static_cast<std::map<int, std::string>::iterator
                (std::map<int, std::string>::*)(int const&)>
                (&std::map<int, std::string>::find),
            std::invoke(&MyClass::dict, this), 3))), "meow");

我已经看不懂invoke啥意思了

这代码里还有赋值还有引用啥的太啰嗦,封装一下

代码语言:javascript复制
namespace mfptr
{
    template<typename Object, typename...Args>
    decltype(auto) find(Object&& object, Args&&...args) {
        return std::forward<Object>(object).find(std::forward<Args>(args)...);
    }

    template<typename Object>
    decltype(auto) dereference(Object&& object) {
        return *std::forward<Object>(object);
    }

    template<typename Object, typename Arg>
    decltype(auto) assign(Object&& object, Arg&& arg) {
        return std::forward<Object>(object) = arg;
    }
}

std::invoke(
    &mfptr::assign<std::string&, char const*>, 
    std::invoke(&std::pair<int const, std::string>::second,
        std::invoke(
            &mfptr::dereference<std::map<int, std::string>::iterator>, 
            std::invoke(
                &mfptr::find<std::map<int, std::string>&, int>,
                std::invoke(&MyClass::dict, this), 3))), "meow");

看个乐,可别学。

  • All Windows threadpool waits can now be handled by a single thread

windows相关的api我不了解,这里贴出来感兴趣的自己看看吧

  • Adventures in application compatibility: The case of the RAII type that failed to run its destructor

涉及到硬件交互,硬件直接抛异常 structured exception 导致RAII没执行成功?这里和COM相关。我没有搞懂

  • Compressing looping animation clips

讲压缩动画的,不了解,这里贴出来感兴趣的自己看

  • String representations are not unique: learn to normalize!

一个字符可能有不同的表达方式,需要归一

代码语言:javascript复制
 "u0065u0301".normalize() == "u00e9".normalize()
true

新项目介绍/版本更新

  • wxWidgets - wxWidgets 3.1.6 Released

看到这里或许你有建议或者疑问或者指出错误,请留言评论! 多谢! 你的评论非常重要!也可以帮忙点赞收藏转发!多谢支持!

本文永久链接

代码语言:txt复制
     This site is open source. [Improve this page](https://github.com/wanghenshui/cppweeklynews/edit/dev/posts/057.md).

0 人点赞