关于postblit和移动语义的问题

fre*_*low 14 templates d return-value copy-constructor move-semantics

我刚才已经问了一个类似的问题,但我仍然不清楚一些细节.

  1. 在什么情况下postblit构造函数调用?

  2. 移动对象的语义是什么?它会被后照亮和/或破坏吗?

  3. 如果按值返回局部变量会发生什么?它会被隐含地移动吗?

  4. 如何将表达式转换为右值?例如,通用交换如何?

Jon*_*vis 16

  1. 每当复制结构时都会调用postblit构造函数 - 例如,在将结构传递给函数时.

  2. 移动是一个按位复制.永远不会调用postblit构造函数.析构函数永远不会被调用.这些位只是复制.原件被"移动",因此不需要创建或销毁任何东西.

  3. 它会被移动.这是此举的主要例子.

  4. swap如果要使功能尽可能高效,功能必须担心许多不同的情况.我建议只使用std.algorithm中swap函数.经典交换会导致复制,因此会调用postblit构造函数和析构函数.移动通常由编译器完成,而不是程序员.然而,看着正式实施swap,它看起来像它起到了一些过关获得移动语义退出交易,其中就可以了.无论如何,移动通常由编译器完成.它们是一种优化,只要它知道它可以做到(RVO是它可以的经典案例).

根据TDPL(第251页),只有2例D 保证会采取行动:

  • 移动所有匿名rvalues,而不是复制.this(this当源是匿名右值(即,上述函数中的特征hun)时,永远不会插入对)的调用.
  • 在函数内堆栈分配的所有命名临时值,然后返回elide一个调用this(this).
  • 无法保证观察到其他潜在的细分.

因此,编译器可能会在其他地方使用移动,但不能保证它会.