【发布时间】:2021-04-11 11:37:13
【问题描述】:
有人抱怨以下函数不起作用,因为它返回“指向局部变量的指针/迭代器”。这个投诉正确吗?我看不到这个问题...
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;
}
返回类型:
using Range = boost::any_range<Handle, boost::forward_traversal_tag, const Handle>;
感谢您的解释和建议的解决方案!
【问题讨论】:
-
Range的类型是什么? -
永远不允许返回对函数局部变量的引用。一旦函数返回,所有函数 loval 变量都会被销毁,留下对它们的任何引用。
-
投诉以下功能无效 -- 谁投诉? C++ 有一种叫做值语义的东西,从它的所有外观来看,您返回的是一个值,而不是指针、迭代器或引用。
-
我的猜测是
boost::any_range只是保存了一个迭代器对,而不是整个向量的副本,当函数返回时,这些迭代器变得无效。 -
将
const Range dummy::foo() const更改为std::vector<Handle> dummy::foo() const
标签: c++ vector boost iterator local-variables