C ++在const向量成员

时间:2016-07-28 11:37:29

标签: c++ c++11 const move-semantics unique-ptr

我有一个具有const vector成员的类,该成员拥有指向某些对象的唯一指针。构造时,sequence对象应该窃取传递给构造函数的唯一指针向量的所有权,以便序列对象现在是向量参数中唯一指针所拥有的对象的所有者。

class sequence
{
    const std::vector< std::unique_ptr< statement > > m_statements;

    sequence( std::vector< std::unique_ptr< statement > > & statements );
};

我第一次尝试实现构造函数时,执行了以下操作:

sequence::sequence( vector< unique_ptr< statement > > & statements )
    m_statements( statements )
{
}

但当然这不会编译,因为人们无法复制 - 构建unique_ptr因此无法复制 - 构建vector

C ++不允许在构造函数体中初始化const成员(就像Java与最终成员一样),但仅在初始化列表中。因此,一种可能的解决方案是删除const的{​​{1}}修饰符,并使用循环将内容从一个向量移动到构造函数体中的另一个向量。

但我希望保留此m_statement修饰符。

所以我想出了另一个似乎可以编译的解决方案,但是因为我是C ++ 11的新手,我不确定它是什么做得很好。我的想法是将上述循环嵌入到lambda函数中,这样我就可以使用循环初始化初始化列表中的const并仍然将m_statement修饰符保留在const上。

m_statement

这个编译。但是我不确定从lambda函数的return语句开始会发生什么。

我假设copy_vec的副本已经制作并返回。当您按值返回唯一指针向量时会发生什么?这是一种正确的方式来做我想要的,尽管很奇怪,或者我只需要将sequence::sequence( vector< unique_ptr< const statement > > & statements ) : m_statements(([ & statements ] { vector< unique_ptr< const statement > > copied_vec; for( auto & stm : statements ) copied_vec.push_back( move( stm ) ); return copied_vec; })()) { } 修饰符放在const上吗?谢谢。

1 个答案:

答案 0 :(得分:6)

我错过了无法使用移动构造函数的原因吗?

sequence::sequence( vector< unique_ptr< statement > > && statements )
    m_statements( std::move(statements) )
{
}