返回对局部变量的引用有问题......?

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 向量本身而不是迭代器包装范围。否则,您可以使用我在另一个答案中使用的完全相同的技术,在该答案中我构建了一个单例范围(具有值语义)。