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