我已经问过a similar question一段时间了,但是在某些细节上我仍然不清楚。
postblit构造函数在什么情况下被调用?
移动对象的语义是什么?它会过后再涂抹和/或破坏吗?
如果我按值返回局部变量会怎样?会隐式地移动吗?
如何将表达式转换为右值?例如,通用交换的外观如何?
最佳答案
每当复制结构时都会调用postblit构造函数-例如将结构传递给函数时。
举动是按位复制。 postblit构造函数从不调用。永远不会调用析构函数。这些位仅被复制。原始文件已被“移动”,因此无需创建或销毁任何内容。
它将被移动。这是此举的典型例子。
如果要提高效率,在许多不同的情况下swap
函数都需要担心。我建议仅使用swap function in std.algorithm。经典交换将导致复制,因此将调用postblit构造函数和析构函数。移动通常是由编译器而不是程序员完成的。但是,swap
的looking at the official implementation似乎起到了一些技巧,可以尽可能地使语义脱离交易。无论如何,移动通常由编译器完成。它们是一种优化,它将在它知道可以做的地方做(RVO是可以做的经典情况)。
根据TDPL(p。251),只有两种情况D保证会发生移动:
所有匿名右值均被移动,而不是被复制。呼叫this(this
)
当源是匿名右值时(即,
临时功能,如上面的功能hun
所示)。
在函数内部堆栈分配的所有命名临时变量,以及
然后返回取消呼叫this(this)
。
不能保证观察到其他潜在的缺陷。
因此,编译器可能在其他地方使用了move,但是并不能保证会使用。
关于templates - 关于postblit和move语义的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6884996/