MyType同时定义了一个副本和一个移动ctor。在执行以下代码段时(在使用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之后调用move构造函数。但在任何情况下,实际上都没有调用构造函数。我怀疑这种行为是编译器优化,但不确定可移植性或是否符合标准。
发布于 2017-12-15 19:40:23
这两个调用都是引用--第一个由lvalue引用,第二个由和rvalue引用。T&&可以同时处理这两种情况,被称为http://en.cppreference.com/w/cpp/language/reference (N4164)。Scott称它们为通用参考文献,并作为模板参数和auto&&特别有用。
std::move用于表示所有权转移,但实际上不进行任何移动。它的作用是static_cast对参考值的影响。
所以你有:
void f(MyType& ) {}
void f(MyType&& ) {}
...
f(o); // calls void f(MyType& )
f(static_cast<MyType&&>(o)); // calls void f(MyType&& )当对象初始化时,通常会调用移动构造函数。
移动构造器 cppreference.com 每当重载解析选择移动构造函数时,都会调用该构造函数,这通常发生在从相同类型的rvalue (xvalue或prvalue) (直到C++17)xvalue (自C++17以来)初始化对象时(通过直接初始化或复制初始化),包括
T a = std::move(b);或T a(std::move(b));,其中b为T型;f(std::move(a));,其中a为T类型,f为void f(T t);return a;在函数(如T f() )中,其中有一个具有移动构造函数的类型为T的is。如果您将f更改为void f(T o),则将为第一个调用调用复制构造函数,为第二个调用调用移动构造函数。
https://stackoverflow.com/questions/47838804
复制相似问题