gpt4 book ai didi

c++ - C++ vector 上的什么操作会导致赋值运算符调用?

转载 作者:行者123 更新时间:2023-11-30 03:40:15 25 4
gpt4 key购买 nike

如果我创建 std::vector<MyClass> MyVector , 在 MyVector 上做了什么操作将导致 MyClass 的赋值运算符打电话?

最佳答案

the assignment operator of MyClass

是一个有点模棱两可的短语。您可能会合理地引用两种赋值操作:

  1. 移动任务。
  2. 复制作业。

此外,如果MyClass没有移动赋值运算符,那么所有需要 MyClass 的东西要移动可分配实际上会调用 MyClass的复制赋值运算符。

更精确的问题可能是两部分:

  1. std::vector<MyClass>的操作是什么?需要 MyClass可以转让吗?

  2. std::vector<MyClass>的操作是什么?需要 MyClass可以复制分配?

如果MyClass具有移动和复制赋值运算符,那么第一组将调用移动赋值运算符,第二组将调用复制赋值运算符。

如果MyClass只有一个复制赋值运算符,那么两个集合都会调用复制赋值运算符。

此答案将分别列出这两个集合。然后你将不得不为你的特定解释它们MyClass如上所述。由于这个答案目前被标记为 [c++11],我将根据 C++11 规范回答:N3290 .对于需要可复制赋值的操作,如果它们还将执行移动赋值运算符(如果存在),我不会费心列出它,因为可移动赋值要求是复制可赋值要求的子集。

std::vector<MyClass>需要 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);

std::vector<MyClass>需要 MyClass 的操作可复制分配:

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<MyClass> 的情况。 (按要求)。对于一些自定义分配器,vector的移动赋值运算符可能涉及对 value_type 的要求可移动分配。确实,说实在的,C++11 std::allocator实际上确实需要这个,但这在很大程度上被视为 N3290 的缺陷和 was subsequently fixed .所以我在我的报告中包含了这个修复。但是,如果您不想包含该修复程序,那么 C++11 的 vector& operator=(vector&& x);需要 value_type也可以移动分配。

关于c++ - C++ vector 上的什么操作会导致赋值运算符调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38172591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com