我有以下代码:
std::vector<Info*> filter(int direction)
{
std::vector<Info*> new_buffer;
for(std::vector<Info*>::iterator it=m_Buffer.begin();it<m_Buffer.end();it++)
{
if(((*it)->direction == direction)
{
new_buffer.push_back(*it);
}
}
return new_buffer;
}
std::vector<Info*> &filteredInfo= filter(m_Direction);
Run Code Online (Sandbox Code Playgroud)
有人能解释一下这里发生了什么吗?过滤器方法是否会按值返回创建一个临时的,并且过滤后的信息永远不会被销毁,因为它的引用?
不确定我是否理解正确.在这种情况下,filteredInfo作为引用而不是一个引用之间的区别是什么?
您的编译器应该抱怨该代码.
这个说法:
std::vector<Info*> &filteredInfo= filter(m_Direction);
Run Code Online (Sandbox Code Playgroud)
是一个坏主意在哪里filter:
std::vector<Info*> filter(int direction);
Run Code Online (Sandbox Code Playgroud)
您正在尝试创建对临时对象的引用.即使它与您的编译器成功,它也是非法的.
你应该使用:
std::vector<Info*> filteredInfo= filter(m_Direction);
Run Code Online (Sandbox Code Playgroud)
它的效率和你想要的一样.无论是move操作(C++ 11)将存在发生或返回值优化将在踢.为了您的实现filter,它应该是RVO上优化建立(这取决于你的编译器的质量虽然).
但是,您应该注意到您正在将原始指针复制到向量中,我希望您拥有正确的所有权模型?如果没有,我建议你使用智能指针.