C++ STL容器移动语义并按值返回:避免了多少次复制?

C++ STL容器移动语义并按值返回:避免了多少次复制?,c++,c++11,return-value,move-semantics,C++,C++11,Return Value,Move Semantics,我知道在c++11中,移动语义已经在STL容器中实现,以避免临时对象。人们说现在编写按值返回的函数是完美的。但我有一些困惑,到底有多少次抄袭是可以避免的。请参见以下示例: vector<int> myVector() { vector<int> res; res.push_back(4); res.push_back(5); return res; } vector<int> v = myVector(); vector

我知道在c++11中,移动语义已经在STL容器中实现,以避免临时对象。人们说现在编写按值返回的函数是完美的。但我有一些困惑,到底有多少次抄袭是可以避免的。请参见以下示例:

vector<int> myVector() {
    vector<int> res;
    res.push_back(4);
    res.push_back(5);
    return res;
}

vector<int> v = myVector(); 
vector myVector(){
向量res;
res.push_back(4);
res.push_back(5);
返回res;
}
向量v=myVector();

我的理解是,在c++03中,
myVector
在计算
vector v=myVector()时返回
res
4
5
复制一次)的副本
vector
的复制构造函数
vector(const vector&)
4
5
复制两次)。然而,在使用移动语义的c++11中,我想知道
4
5
的哪个副本被避免了?二者都是否调用了返回值优化以减少一次复制
4
5

在C++03中有两个副本,在C++11中有两个移动

在C++03和C++11中,复制/移动都会被省略,因此(在这样的示例中)不可能发生复制/移动

vector<int> myVector() {
  vector<int> res;
  res.push_back(4);
  res.push_back(5);
  return res;// <- Here we construct the return value with res
} 

// here we construct v with the return value of myVector:
vector<int> v = myVector(); 
vector myVector(){
向量res;
res.push_back(4);
res.push_back(5);

return res;//在C++03中,它是两个副本,都可以省略。在C++11中,它是两个移动,都可以省略。为什么有两个移动?同样的原因在C++03中可以有两个副本-从
res
移动到返回值,然后从返回值移动到
v
。移动I:retur语句中的表达式ned值。Move II:返回值到捕获返回值的实体(
v
,在您的问题中)。移动和复制都不可能发生:它们可能被忽略。C++11的关键变化是,如果移动确实发生,它只是一个移动,而不是[deep]复制。所以在v被销毁之前不会调用析构函数?@user2345484可能。标准允许省略,但不保证。(实际上,您可以预测何时会发生)。如果两种情况都发生省略,则是的,只有一个具有一个生存期的值存在,并且直到
v
超出范围后才会销毁。现在,
v
可以省略到另一个变量中,在这种情况下,销毁将更晚。