前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 动态新闻推送 第31期

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

作者头像
王很水
发布2021-09-26 11:10:14
3500
发布2021-09-26 11:10:14
举报

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那种功能(可能需要编译器开洞?)

代码语言:javascript
复制
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类型的结合可能有点问题

代码语言:javascript
复制
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会多两次复制

改成

代码语言:javascript
复制
Object makeObject(const std::string &s);

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

但更多场景是这样的的

代码语言:javascript
复制
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 ,代码意义上的存在,虽然无法使用

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

代码语言:javascript
复制
template<class T>
struct C {
    C(const C&) requires (sizeof(T) != 1);
}

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

这里有个msvc的例子

代码语言:javascript
复制
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>

视频

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

实际上就是这段代码

代码语言:javascript
复制
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包详情页

  • [Bitmaps! Or “Images and Animations Without Linking External Libraries” - Mariusz Różycki C++ on Sea](Bitmaps! Or “Images and Animations Without Linking External Libraries” - Mariusz Różycki C++ on Sea)

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

项目

  • btop一个top实现,类似htop那种ui界面
  • stralgo 一个string算法库,各种转换小工具,header-only
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++ 动态新闻推送 第31期
    • 资讯
      • 编译器信息最新动态推荐关注hellogcc公众号
    • 文章
      • 视频
        • 把cpp on sea的视频总结一下
      • 项目
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档