代码之家  ›  专栏  ›  技术社区  ›  CorellianAle

向构造函数和成员函数传递参数时移动或复制

  •  0
  • CorellianAle  · 技术社区  · 6 年前

    struct Config
    {
        Config();
        Config(const std::string& cType, const std::string& nType); //additional variables omitted
        Config(Config&&) = default;
        Config& operator=(Config&&) = default;
    
        bool operator==(const Config& c) const;
        bool operator!=(const Config& c) const;
    
        void doSomething(const std::string& str);
        bool doAnotherThing(const MyOtherObject& obj);
        void doYetAnotherThing(int value1, unsigned long value2, const std::string& value3, MyEnums::Seasons value4, const std::vector<MySecondObject>& value5);
    
        std::string m_controllerType;
        std::string m_networkType;
        //...
    };
    
    //...
    
    Config::Config(const std::string& cType, const std::string& nType) :
        m_controllerType(cType),
        m_networkType(nType)
    {
    }
    

    • 强制编译器创建 default ctor() : m_v1(std::move(v1)), m_v2(std::move(v2)), m_v3(std::move(v3)) {}

    std::mutex std::unique_ptr

    我见过很多代码,人们通过值传递复杂的对象,比如大字符串、向量和自定义类——我相信这就是移动语义发生的地方,但是,同样,如何通过移动将对象传递给函数?如果我是正确的,它会使一个对象处于“一种空状态”,使其无法使用。

    -如何正确决定传递值和传递引用? -是否需要显式地编写移动和复制构造函数?我可以用吗 = default -调试时,我总是可以写 std::cout << "move\n"; std::cout << "copy\n"; 在我自己类的构造函数中,但是我如何知道 stdlib

    另外,这看起来像是绝望的呼喊,不是一个有效的问题。我只是不知道比这更好地阐述我的问题。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Yakk - Adam Nevraumont    6 年前
    • 如果您不打算存储它的副本,请传递值或 const&

    • 如果你想储存一份复印件,而且搬家很便宜,复印也有点贵,那就过去吧。 .

    • std::move .

    The Rule of 0/3/5 =default 除了资源管理类型。如果你想实现 复制/移动/销毁,需要实现, =delete

    如果对setter只接受1个参数,请考虑将 && 施工

    安置方式如下:

    struct emplace_tag {};
    struct wrap_foo {
      template<class...Ts>
      wrap_foo(emplace_tag, Ts&&...ts):
        foo( std::forward<Ts>(ts)... )
      {}
      template<class T0, class...Ts>
      wrap_foo(emplace_tag, std::initializer_list<T0> il, Ts&&...ts):
        foo( il, std::forward<Ts>(ts)... )
      {}
    private:
      Foo foo;
    };
    

    emplace_back emplace ::new

    operator T()