我必须构建一个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
自己出于此。但这更像是“这里到底发生了什么?”无论如何,有点问题。
答案 0 :(得分:2)
最有可能的是,正在进行一些转换。您应该使用实际迭代器的值类型T
,而不是typename Container::const_iterator::value_type
。如果该类型与T
不同,则转化会创建一个临时的,您尝试返回参考。
另一方面,如果您确实需要转换,请按值T operator*() const
返回。