我知道有几次被问过,我读了几篇关于它的教程,但我还是找不到答案。
让我们有典型的课程
class Foo
{
public:
Foo() : i_(0) { std::cout << "Foo Empty ctor" << std::endl; }
Foo(const Foo& foo) : i_(foo.i_) { std::cout << "Foo Copy ctor" << std::endl; }
Foo(int i) : i_(i) { std::cout << "Foo Param ctor" << std::endl; }
Foo(Foo&& foo) : i_(foo.i_) { foo.i_ = 0; std::cout << "Foo Move ctor" << std::endl; }
Foo(const Foo&& foo) : i_(foo.i_) { std::cout << "Foo const Move ctor" << std::endl; }
~Foo() { std::cout << "Foo " << i_ << " destroyed\n"; }
Foo& operator=(Foo&& other)
{
i_ = std::move(other.i_);
std::cout << "Foo Move assigned\n";
return *this;
}
private:
int i_;
};
Foo getFoo()
{
return Foo(99);
}
int main()
{
Foo f1;
Foo f2(5);
Foo f3(f2);
Foo f4(Foo(4));
Foo f5(std::move(Foo(6));
Foo f6 = getFoo();
Foo f7 = Foo(1);
}
输出
// f1
Foo Empty ctor
// f2
Foo Param ctor
// f3
Foo Copy ctor
// f4 - copy elision
Foo Param ctor
// f5
Foo Param ctor
Foo Move ctor
// f6 - copy elision
Foo Param ctor
// f7 - copy elision
Foo Param ctor
因此,除非我明确调用move运算符,否则即使不声明移动语义,复制省略优化也会做同样的工作。
1 - 如果我们没有处理指针并且我不打算调用一个显式的std :: move(所以我认为像示例中的隐式调用一样)是否有意义声明移动语义如果副本elision做的不一样吗?
2 - 对于具有简单数据的小类,通常会感觉到声明移动语义吗?它有真正的优势吗?