返回对局部变量的引用有问题......?
Problems with returning references to local variables...?
有人抱怨以下函数不起作用,因为它 returns“pointers/iterators 到局部变量”。这个投诉正确吗?我看不出这个问题...
const Range dummy::foo() const
{
std::vector<Handle> _handles;
_handles.reserve(_collection.size());
for (const auto& pair: _collection)
{
_handles.push_back(pair.first);
}
return _handles;
}
Return 类型:
using Range = boost::any_range<Handle, boost::forward_traversal_tag, const Handle>;
感谢您的解释和建议的解决方案!
Is this complaint correct?
是的。 _handles
是一个自动变量,而你 return 是一个引用它的范围。范围基本上是对迭代器 + 哨兵对的抽象。 returned 范围在函数外无效。
And how can I solve this
正确的实现是 return 转换适配器范围。可能类似于:
return _collection | boost::adaptors::map_keys;
有趣的是,我一个月前在这里的回答中预测到了这一点:
这个问题和你的问题很相似initializer_list:
That approach invokes Undefined Behaviour because the initializer list doesn't exist after returning.
这里,同样适用于向量。
您当然可以 return 向量本身而不是迭代器包装范围。否则,您可以使用我在另一个答案中使用的完全相同的技术,在该答案中我构建了一个单例范围(具有值语义)。
有人抱怨以下函数不起作用,因为它 returns“pointers/iterators 到局部变量”。这个投诉正确吗?我看不出这个问题...
const Range dummy::foo() const
{
std::vector<Handle> _handles;
_handles.reserve(_collection.size());
for (const auto& pair: _collection)
{
_handles.push_back(pair.first);
}
return _handles;
}
Return 类型:
using Range = boost::any_range<Handle, boost::forward_traversal_tag, const Handle>;
感谢您的解释和建议的解决方案!
Is this complaint correct?
是的。 _handles
是一个自动变量,而你 return 是一个引用它的范围。范围基本上是对迭代器 + 哨兵对的抽象。 returned 范围在函数外无效。
And how can I solve this
正确的实现是 return 转换适配器范围。可能类似于:
return _collection | boost::adaptors::map_keys;
有趣的是,我一个月前在这里的回答中预测到了这一点:
这个问题和你的问题很相似initializer_list:
That approach invokes Undefined Behaviour because the initializer list doesn't exist after returning.
这里,同样适用于向量。
您当然可以 return 向量本身而不是迭代器包装范围。否则,您可以使用我在另一个答案中使用的完全相同的技术,在该答案中我构建了一个单例范围(具有值语义)。