【发布时间】:2018-05-30 01:05:08
【问题描述】:
MyType 定义了复制和移动 ctor。执行以下sn-p时(用VS2015编译后):
template<typename T>
void f(T&& o) {
// do something with o
}
int main() {
MyType o{ 1, 2, 3 };
f(o); // call of copy-constructor expected
f(std::move(o)); // call of move-constructor expected
}
我本来希望在第一次调用f 之后调用复制构造函数,并在第二次调用f 之后调用移动构造函数。但是在任何情况下实际上都没有调用构造函数。我怀疑这种行为是编译器优化,但不确定可移植性或是否符合标准。
【问题讨论】:
-
您希望
MyType& r = o调用复制构造函数吗? -
@Barry:不,当然不是。我错过了 T&& 在模板中被推断为 T& 的观点。但是关于第二次调用
f(std::move(o)),我仍然不知道 f 中的对象如何引用另一个在调用站点被移动的对象。 -
如果不是通过调用 move ctor(我实际定义的,请参阅我的问题),那么这个临时对象究竟是如何构造的?
-
@Angle.Bracket 要检查某些东西是否是编译器优化,您可以使用编译器资源管理器而不定义要检查的函数。如果编译器看不到实现,则无法优化。例如 godbolt.org/g/dp9wao 您不必完全理解程序集。只需查看
call语句即可了解其名称。
标签: c++ c++11 c++14 move-semantics perfect-forwarding