C++ 中文周刊 第78期

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

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

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

可以贴在下一期草稿里 草稿链接

2022 09 02


资讯

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

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

文章

尽量让move 构造函数 noexcept, 不然用vector可能有问题,多copy

比如这个

struct Instrument {
    int n_;
    std::string s_;

    Instrument(const Instrument&) = default;

    // WRONG!!
    Instrument(Instrument&& rhs)
        : n_(std::exchange(rhs.n_, 0)),
          s_(std::move(s_))
        {}

    // RIGHT!!
    Instrument(Instrument&& rhs) noexcept
        : n_(std::exchange(rhs.n_, 0)),
          s_(std::move(s_))
        {}
};

如果不是noexcept,vector的move判定内部的T不是is_nothrow_move_constructible, 那就构造复制一份,所以多了个拷贝。也就是博主说的vector pessimization问题

vector本身的搬迁move的多余动作,如果能nothrow,move就更简单

free没有size看上去是个巧妙的设计,实际上隐含了挺多脏活

实际上,malloc/free/realloc等等,这些api还是太低层太精细了。对于使用者心理负担很大。

感谢@lh_mouse补充

协程背后都做了啥

有点意思

struct foo {
   [[nodiscard]] foo(auto& resource) {}
};

struct [[nodiscard]] bar {};

auto fn() -> bar;

[[nodiscard]] auto fn2() -> bool;

int main(int, char** argv){
    foo{argv}; // ignoring temp created by [[nodiscard]]
    fn();      // ignoring return value with [[nodiscard]]
    fn2();     // ignoring return value with [[nodiscard]]
}

老文,科普一下概念。

参数不是constexpr

consteval auto square(int x) -> int { return x * x; }

constexpr auto twice_square(int x) -> int { return square(x); }

编译不过。作者展示了一下编译期计算。哎又回去了。constexpr还是不够const

看个乐

介绍这几个flag

-march=native肯定接触过吧

茴香豆的茴的20种写法

为什么大哥解bug这么熟练

视频

static constexpr 和 inline constexpr区别。inline constexpr能合并文件重复的数据,是文件级别,static是函数级别,并不能合并代码段

聪明的你想到了static inline constexpr。这个效果就是static constexpr。static限制了范围

当然,-fmerge-contants能从另一个层面解决这个问题

感谢@lh_mouse补充

开源项目需要人手

工作招聘

寒冬了


本文永久链接

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