我的类型是仅移动的,禁止复制。
我想在某些系统中传递它,但是我不确定将哪种类型的签名用于采用该类型参数的函数。这种类型的对象必须移到系统中,不得进行任何复制。

例:

#include <vector>
class Foo
{
public:
    Foo( std::string name ) : m_name( std::move( name ) ){}
    Foo( Foo&& other ) : m_name( std::move( other.m_name ) ){}
    Foo& operator=( Foo&& other ){ m_name = std::move( other.m_name ); }

    const std::string& name() const { return m_name; }
    // ...
private:
    Foo( const Foo& ) ;//= delete;
    Foo& operator=( const Foo& ) ;//= delete;
    // ...

    std::string m_name;
};

class Bar
{
public:

    void add( Foo foo )  // (1)
        // or...
    void add( Foo&& foo ) // (2)
    {
        m_foos.emplace_back( std::move(foo) ); // if add was template I should use std::forward?
    }


private:
    std::vector<Foo> m_foos;
};

void test()
{
    Bar bar;
    bar.add( Foo("hello") );

    Foo foo("world");
    bar.add( std::move(foo) );
}

(假设我正在移动对象,两个签名都将在VS2012中编译)

首选在1和2之间的哪个签名?

看起来两者都可行,但我认为必须有所区别...

最佳答案

从xvalue移出时,签名#1将花费2个移动构造,而从xvalues移出时,签名#2将仅花费1个移动构造。因此,#2对我来说听起来更好。但是,只要搬家构造便宜,任何一个签名都可以完成工作。你想要:

  • 真的很快,或
  • 真的快两倍吗?

  • :-)

    关于c++ - 如何编写具有仅 move 属性的函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12416156/

    10-12 14:51