C++ 中文周刊 第31期

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

每周更新

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

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


资讯

编译器信息最新动态推荐关注hellogcc公众号

OSDT Weekly 2021-09-22 第116期

标准委员会九月邮件列表直达

文章

讨论了各种各样新方案以及相关的abi-break问题,ABI-break这个问题必须要面对了,标准委员会还在拖

感觉未来要做ABI-break支持的准备的了

直接看结论吧

We attempted to represent ownership and borrowing through the C++ type system, however the language does not lend itself to this. Thus memory safety in C++ would need to be achieved through runtime checks.

试验了实现borrow-checker库,但是语言库层面有局限实现不了rust那种功能(可能需要编译器开洞?)

static_assert(std::string_view{"07:36::22"} == std::string_view{__TIME__}); // will only pass at certin time
static_assert(std::string_view{"Sep 19 2021"} == std::string_view{__DATE__}); // will only pass at certin date

没什么卵用的知识

借助coroutine实现iterator生成器

异步调用的堆栈分析一直是个麻烦的问题 这里介绍folly在这方面做的一些工作,如何实现打印异步的堆栈

使用coroutine来搞。很有意思

coroutine相关的概念在现在来说,需要面对并且掌握了,不然后面的文章可能看不懂

std::optional和非POD类型的结合可能有点问题

class Object {
 private:
  std::string _s;

 public:
  Object() { puts("default-constructed"); }
  ~Object() { puts("destroyed"); }

  explicit Object(const std::string &s) : _s(s) { puts("constructed"); }

  Object(const Object &m) : _s(m._s) { puts("copy-constructed"); }
  Object &operator=(const Object &m) {
    puts("copy-assinged");
    _s = m._s;
    return *this;
  }

  Object(Object &&m) : _s(std::move(m._s)) { puts("move-constructed"); }
  Object &operator=(Object &&m) {
    puts("move-assigned");
    _s = std::move(m._s);
    return *this;
  }

  void dump() const { puts(_s.c_str()); }
};
std::optional<Object> maybe(const std::string &s) {
  if (s.empty()) {
    return std::nullopt;
  }
  return Object(s);
}

看起来没啥问题

但31行的return会多两次复制

改成

Object makeObject(const std::string &s);

std::optional<Object> maybe(const std::string &s) {
  if (s.empty()) {
    return std::nullopt;
  }
  return makeObject(s);
}

但更多场景是这样的的

std::optional<Object> maybe(const std::string &s) {
  if (s.empty()) {
    return std::nullopt;
  }
  Object o(s);
  doSomething(o);
  return o;
}

导致拷贝不可避免

一个小弊端,但是optional的收益不是特别高,仅仅一个语法糖

不过不必过于纠结这个问题

std::expected做铺垫的。都没有std::expected

也许你会说delete拷贝构造函数不就行了,其实delete了也是存在的(present),不过被标记成了delete ,代码意义上的存在,虽然无法使用

那么有没有真正的解决办法呢?

template<class T>
struct C {
    C(const C&) requires (sizeof(T) != 1);
}

由于require不满足条件,拷贝构造不会生成,char不满足条件,也就是说C<char>没拷贝构造

这里有个msvc的例子

struct FromC { FromC(const C<char>&); };
void f(C<char>);
void f(FromC);
void test(const C<char>& c) {
    f(c);
        // C<char>没有拷贝构造函数,不应该匹配上,应该匹配FromC
}

const C<char>& c转换为C<char>需要拷贝构造但C<char>没有,所以匹配FromC

当前clang和gcc还没有实现类似的场景,匹配了C<char>

视频

这个视频有三分钟的内嵌广告,有没有懂的说下这个广告值多少钱

实际上就是这段代码

auto a = 0xFF'AA;
auto num = 1'000'000'000'000;

注意这个分号的用法,增加代码可读性

实际上现在新的语言都加了这个小语法糖,分隔符,比如rust

数字字面值 例子
Decimal (十进制) 98_222
Hex (十六进制) 0xff
Octal (八进制) 0o77
Binary (二进制) 0b1111_0000
Byte (单字节字符)(仅限于u8) b'A'

把cpp on sea的视频总结一下

写了一个reavel.js和compile explorer结合的npm包,这样代码演示片段可以直接跳转到complie explore里面去看,很有意思

使用方法在npm包详情页

把代码打印成图,用imagemagick的convert来转,代码在这里

项目

工作

亚马逊redshift招c++工程师开发数据库

国内的招聘太多了列不过来。先放放


本文永久链接

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