C++ 在 const vector 成员的初始化列表中嵌入 lambda

标签 c++ c++11 constants move-semantics unique-ptr

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

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 对 final 成员所做的那样),但只能在初始化列表中。因此,一种可能的解决方案是删除 m_statementconst 修饰符,并使用循环将构造函数主体中的内容从一个 vector move 到另一个 vector 。

但我想保留这个 const 修饰符。

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

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;
    })())
{
}

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

我假设复制了一份 copied_vec 并返回了。当您按值返回唯一指针的 vector 时会发生什么?这是做我想做的事情的正确方法,尽管很奇怪,还是我必须将 const 修饰符放在 m_statetent 上?谢谢。

最佳答案

我是否遗漏了不能使用 move 构造函数的原因?

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

关于C++ 在 const vector 成员的初始化列表中嵌入 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38635236/

相关文章:

c++ - 我想给一个字符串一个值

C++ 重复 do-if-do 模式

java - 隐藏实现细节是封装还是抽象?

javascript - 为什么 for..of/for..in 循环可以使用 const 而普通的 for 循环在 JS 中只能使用 let 或 var 作为其变量?

c++ - 是否可以在 C++ 编译时计算函数长度?

java:类似C的选项参数

c++ - 如果我调用 new 和 delete,管理 dll 类的内存是否安全?

c++ - OpenCV 只对鱼眼图像的中心部分进行不失真处理

c++ - 如何开启英特尔C++编译器12.1.2的C++0x

c++ - 指向堆栈分配对象的指针和引用