【问题标题】:How does copy assignment work in for folly::Optional<T>?复制分配如何用于 folly::Optional<T>?
【发布时间】:2021-02-21 09:58:00
【问题描述】:

我正在阅读 copy assignment 的 folly::Optional 中的代码,但我不清楚对 construct() 的调用究竟是如何为可选项赋值的。具体在construct()这个表达式是如何工作的?

new (const_cast<void*>(ptr)) Value(std::forward<Args>(args)...);

【问题讨论】:

  • 您已在此处链接了一个内部 FB 页面。可能想找到外部链接?
  • 它在现有内存位置上使用placement new
  • 您提供的链接不适用于复制构造函数,并且您引用的代码不存在,顺便说一句。
  • 您可能感兴趣:en.cppreference.com/w/cpp/memory/construct_at。 Folly 似乎只是为 C++20 之前的代码提供了自定义版本(现在基本上是所有代码;)。
  • 编辑链接指向外部的、公开可用的 folly::Optional 版本。

标签: c++ optional folly


【解决方案1】:

解构你写的那行:

std::forward&lt;Args&gt;(args)... 正在执行variadic-template perfect forwarding。从本质上讲,这意味着对于任意数量的参数,任何 r 值都将被转发到,依此类推。

Value(std::forward&lt;Args&gt;(args)...) 在这些参数上调用Value 的构造函数。

new (const_cast&lt;void*&gt;(ptr)) ...正在呼叫placement new

所以这句话的意思是,在这个特定的内存位置创建一个对象,通过转发你得到的所有参数在那里构造对象。

【讨论】:

  • 我对 new 缺少范围运算符感到有点惊讶。我想这对 FB 来说太偏执了。
  • @Yakk-AdamNevraumont 有趣
  • @Yakk-AdamNevraumont 根据我的经验,Facebook/Folly 不太关心可移植性和“极端情况”。 (例如,它的PackedSyncPtr 仅适用于某些列出的架构,并且只会在其他架构上触发编译错误。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
相关资源
最近更新 更多