迭代std :: set会创建临时的吗?

时间:2011-12-09 01:22:17

标签: c++ stl iterator

我必须构建一个const_iterator包装器来交换带有动态绑定的泛型编程(更别提这个了)。但是std::set<Base*>::const_iterator::operator*()给了我一些我没想到的东西,因为我无法在Derived* const& Derived公开继承Base的情况下将其返回。

template <typename T, typename Container> class StdConstIterator : public ConstIteratable<T> {
  private:
    typename Container::const_iterator it;
  public:
    T const& operator*() const {
      return *it; // g++ says: warning: returning reference to temporary
    }
};

// invokation
StdConstIterator<Derived*,std::set<Base*> > si;

虽然我发现指针复制它们而不是返回引用可能是合理的,但是我在STL的实现中找不到专门化。你能解释一下这个问题吗?

注意:你可能知道这个例程;不幸的是没有C ++ 11的支持,所以我不能decltype自己出于此。但这更像是“这里到底发生了什么?”无论如何,有点问题。

1 个答案:

答案 0 :(得分:2)

最有可能的是,正在进行一些转换。您应该使用实际迭代器的值类型T,而不是typename Container::const_iterator::value_type。如果该类型与T不同,则转化会创建一个临时的,您尝试返回参考。

另一方面,如果您确实需要转换,请按值T operator*() const返回。