Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+上的什么操作+;向量导致赋值运算符调用?_C++_C++11 - Fatal编程技术网

C++ C+上的什么操作+;向量导致赋值运算符调用?

C++ C+上的什么操作+;向量导致赋值运算符调用?,c++,c++11,C++,C++11,如果我创建std::vector MyVector,对MyVector的什么操作将导致调用MyClass的赋值运算符 MyClass 这是一个有点模棱两可的短语。您可能会合理地参考两种分配操作: 移动作业 复印作业 此外,如果MyClass没有移动分配操作符,那么要求MyClass可移动分配的所有操作实际上都将调用MyClass的复制分配操作符 一个更精确的问题可能是由两部分组成的: std::vector的哪些操作要求MyClass可移动分配 std::vector的哪些操作要求MyClass

如果我创建
std::vector MyVector
,对
MyVector
的什么操作将导致调用
MyClass
的赋值运算符

MyClass

这是一个有点模棱两可的短语。您可能会合理地参考两种分配操作:

  • 移动作业
  • 复印作业
  • 此外,如果
    MyClass
    没有移动分配操作符,那么要求
    MyClass
    可移动分配的所有操作实际上都将调用
    MyClass
    的复制分配操作符

    一个更精确的问题可能是由两部分组成的:

  • std::vector
    的哪些操作要求
    MyClass
    可移动分配

  • std::vector
    的哪些操作要求
    MyClass
    是可复制分配的

  • 如果
    MyClass
    同时具有移动和复制分配运算符,则第一组将调用移动分配运算符,第二组将调用复制分配运算符

    如果
    MyClass
    只有一个复制分配运算符,则两个集合都将调用复制分配运算符

    此答案将分别列出这两组。然后,您必须按照上面所述,为特定的
    MyClass
    解释它们。由于这个答案目前被标记为[c++11],我将根据c++11规范进行回答:。对于需要复制可分配的操作,如果它们还将执行移动分配操作符(如果存在),我不想列出它,因为移动可分配需求是复制可分配需求的子集

    std::vector
    需要移动可分配的
    MyClass
    操作:

    template <class InputIterator>
        void assign(InputIterator first, InputIterator last); // when v = *first would call the move assignment operator
    template <class... Args> iterator emplace(const_iterator position, Args&&... args);  // if args is not an lvalue value_type
    iterator     insert(const_iterator position, value_type&& x);
    template <class InputIterator>
    iterator insert(const_iterator position,
                    InputIterator first, InputIterator last);  // if value_type = *first does not call the copy assignment operator
    iterator erase(const_iterator position);
    iterator erase(const_iterator first, const_iterator last);
    
    vector& operator=(const vector& x);
    vector& operator=(initializer_list<value_type>);
    template <class InputIterator>
        void assign(InputIterator first, InputIterator last); // when v = *first would call the copy assignment operator
    void assign(size_type n, const value_type& u);
    void assign(initializer_list<value_type>);
    template <class... Args> iterator emplace(const_iterator position, Args&&... args);  // if args is an lvalue value_type
    iterator insert(const_iterator position, const value_type& x);
    iterator insert(const_iterator position,
                    InputIterator first, InputIterator last);  // if value_type = *first does call the copy assignment operator
    iterator insert(const_iterator position, initializer_list<value_type> il);
    

    另外,请注意,这个答案学究式地回答了
    std::vector
    (如所问)的情况。对于某些自定义分配器,
    vector
    的move赋值运算符可能要求
    value\u type
    是可移动赋值的。事实上,要真正学究化,C++11
    std::allocator确实需要这样做,但这在很大程度上被视为和的缺陷。所以我在我的报告中包括了这个修正。但是,如果您不想包含该修复,那么C++11的
    vector&operator=(vector&x)
    要求
    值类型
    也是可移动分配的。

    我相信C++11只要求这样的类型是可移动分配的。你说的是哪一个赋值运算符?此外,如果您解释了您试图解决的问题和/或提供了一些代码来将问题上下文化,这可能会有所帮助。如果不声明
    MyClass
    ,这不是毫无意义吗?可以调用哪些构造函数/运算符取决于哪些可用,哪些被删除/私有。是否调用它们还取决于您对
    向量的操作。那会是什么?你可以在
    MyClass
    上输入你自己的移动赋值和复制赋值运算符来找出答案!(假设您需要这两方面的信息。)正如@underline_d所指出的,这还取决于您是否有移动/复制构造函数和移动/复制赋值操作符。例如,如果您插入()并且必须展开向量,则向量会将所有MyClass对象移动到新的(更大的)缓冲区;但是,如果没有移动可用,则必须复制并分配它们。完整的答案可能取决于STL实现。@DavidThomas很重要,用diagnostic
    cout
    s实现所有感兴趣的CTOR/运算符是实际测试这一点的方法,根据我的经验,可以得到非常有趣的结果。显然,我当时的想法太过直截了当了!