背景
我今天早些时候阅读了以下答案,感觉就像是在重新学习 C++。
然后我想知道我是否应该改变我的“方式”来使用这些令人兴奋的功能;我主要关心的是代码效率和清晰度(前者对我来说比后者更重要)。这导致我这篇文章:
我强烈不同意(我同意答案,即);我不认为巧妙地使用指针会使移动语义变得多余,无论是在效率还是清晰度方面。
问题
目前,每当我实现一个重要的对象时,我大致这样做:
struct Y
{
// Implement
Y();
void clear();
Y& operator= ( const& Y );
// Dependent
~Y() { clear(); }
Y( const Y& that )
: Y()
{
operator=(that);
}
// Y(Y&&): no need, use Y(const Y&)
// Y& operator=(Y&&): no need, use Y& operator=(const Y&)
};
根据我从今天阅读的前两篇文章中了解到的情况,我想知道改成这个是否有益:
struct X
{
// Implement
X();
X( const X& );
void clear();
void swap( X& );
// Dependent
~X() { clear(); }
X( X&& that )
: X()
{
swap(that);
// now: that <=> X()
// and that.~X() will be called shortly
}
X& operator= ( X that ) // uses either X( X&& ) or X( const X& )
{
swap(that);
return *this;
// now: that.~X() is called
}
// X& operator=(X&&): no need, use X& operator=(X)
};
现在,除了稍微复杂和冗长之外,我看不到第二个 ( struct X
) 会产生性能改进的情况,而且我发现它的可读性也较差。假设我的第二个代码正确使用了移动语义,它将如何改进我当前的做事“方式”(struct Y
)?
注1:我认为使后者更清楚的唯一情况是“退出功能”
X foo()
{
X automatic_var;
// do things
return automatic_var;
}
// ...
X obj( foo() );
我认为替代方法使用std::shared_ptr
,std::reference_wrapper
如果我厌倦了get()
std::shared_ptr<Y> foo()
{
std::shared_ptr<Y> sptr( new Y() );
// do things
return sptr;
}
// ...
auto sptr = foo();
std::reference_wrapper<Y> ref( *ptr.get() );
只是稍微不太清楚,但同样有效。
注2:我确实努力使这个问题准确和可回答,并且不受讨论;请仔细考虑,不要将其解释为“为什么移动语义有用”,这不是我要问的。