1

我发现了一段 C++ 代码,如下所示:

// constructor that creates a 2D vector _store[nRow][nCol]
FlexiMatrix::FlexiMatrix(int nRow)
{
    for (int i = 0; i < nRow; i++){
        _store.push_back( vector<int>() );    
        _store[i].push_back( 0 );
    }
}

_store声明如下:vector< vector<int> > _store;

这似乎违反了我对局部变量和堆栈的理解。当我们退出这个构造函数时,本地创建的向量的内存不应该不存在吗?鉴于vector<int>.push_back()需要别名引用作为其输入参数,因此更是如此,因此永远不会调用复制构造函数,并且push_back()接收的是对局部变量的实际引用?

4

1 回答 1

6

所以复制构造函数永远不会被调用,push_back()接收的是对局部变量的实际引用?


std::vector_push_back(),复制传递的对象。作为参数传递的对象的内容可能会被复制/移动(在 C++11 中)到新创建的对象。

push_back()从 C++11 开始有两种形式:

void push_back (const value_type& val);
void push_back (value_type&& val);

在您的情况下,vector<int>()创建一个临时(r 值),因此将使用第二种形式。第二种形式会将临时的内容移动到添加到向量中的新对象。因此,它将使用移动构造函数而不是复制构造函数。

于 2012-12-01T04:35:27.997 回答