在C ++ 11 STL中使用移动语义最常见的地方是什么?

时间:2017-02-17 09:17:15

标签: c++11 stl move-semantics

我知道@Override public View getView(int position, View convertView, ViewGroup parent) { MyViewHolder mViewHolder; if (convertView == null) { convertView = inflater.inflate(R.layout.layout_country_list_item, parent, false); mViewHolder = new MyViewHolder(convertView); convertView.setTag(mViewHolder); } else { mViewHolder = (MyViewHolder) convertView.getTag(); } ListData countryListData = getItem(position); mViewHolder.tvCountryName.setText(countryListData.getCountryName()); mViewHolder.IVDesc.setImageResource(R.id.my_country_name); return convertView; } 已经移动了语义支持。因此,当我向向量添加命名的临时实例时,我可以使用std::vector<T>::push_back()

STL的其他常见地方我应该养成添加std::move()的习惯

1 个答案:

答案 0 :(得分:2)

  

我知道std::vector<T>::push_back()已经移动了语义支持。

push_back所拥有的支持只是一个额外的重载,它带有右值引用,因此可以通过调用{{}来构造向量中的新值T。 1}}而不是T(T&&)。优点是前者可以更有效地实现,因为它假定传递的右值引用以后永远不会被使用。

大多数标准库容器都为其push / enqueue / insert成员函数添加了类似的重载。此外,安置的概念已添加(例如T(const T&),其中值在容器内部构造,以避免不必要的临时值。安置应该优先插入/推动。

  

因此,当我向矢量添加命名的临时实例时,我可以使用std::vector<T>::emplace_back

“命名为临时”并没有多大意义。这个想法是你有一个你不再关心的左值,你想通过std::move()把它变成一个临时的。例如:

std::move

请记住Foo foo; some_vector.emplace_back(std::move(foo)); // I'm sure `foo` won't be used from now on 并不特别:它的字面意思是std::move

  

STL中我应该养成添加static_cast<T&&>习惯的其他常见地方是什么?

这是一个非常广泛的问题 - 您应该在任何有意义的地方添加std::move,而不仅仅是在标准库的上下文中。如果你有一个左值,你知道你不会再在特定的代码路径中使用它,并且你想将它传递/存储在某个地方,那么std::move它。