C++ 在 const 向量成员的初始化列表中嵌入 lambda
C++ Embded lambda in initializer list for const vector member
我有一个 class,它有一个 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 对 final 成员所做的那样),但只能在初始化列表中。因此,一种可能的解决方案是删除 m_statement
的 const
修饰符,并使用循环将内容从一个向量移动到构造函数主体中的另一个向量。
但我想保留这个 const
修饰符。
所以我想出了另一个似乎可以编译的解决方案,但因为我是 C++11 的新手,所以我不确定它究竟做了什么。我的想法是将上述循环嵌入到一个 lambda 函数中,这样我就可以使用循环在初始化列表中初始化 m_statement
,并且仍然保留 m_statement
.[=25 上的 const
修饰符=]
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 函数的 return 语句开始会发生什么。
我假设制作了 copied_vec 的副本并 returned。当你 return 值一个唯一指针的向量时会发生什么?尽管很奇怪,但这是做我想做的事情的正确方法,还是我必须将 const
修饰符放在 m_statetent
上?谢谢。
我是否遗漏了不能使用移动构造函数的原因?
sequence::sequence( vector< unique_ptr< statement > > && statements )
m_statements( std::move(statements) )
{
}
我有一个 class,它有一个 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 对 final 成员所做的那样),但只能在初始化列表中。因此,一种可能的解决方案是删除 m_statement
的 const
修饰符,并使用循环将内容从一个向量移动到构造函数主体中的另一个向量。
但我想保留这个 const
修饰符。
所以我想出了另一个似乎可以编译的解决方案,但因为我是 C++11 的新手,所以我不确定它究竟做了什么。我的想法是将上述循环嵌入到一个 lambda 函数中,这样我就可以使用循环在初始化列表中初始化 m_statement
,并且仍然保留 m_statement
.[=25 上的 const
修饰符=]
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 函数的 return 语句开始会发生什么。
我假设制作了 copied_vec 的副本并 returned。当你 return 值一个唯一指针的向量时会发生什么?尽管很奇怪,但这是做我想做的事情的正确方法,还是我必须将 const
修饰符放在 m_statetent
上?谢谢。
我是否遗漏了不能使用移动构造函数的原因?
sequence::sequence( vector< unique_ptr< statement > > && statements )
m_statements( std::move(statements) )
{
}