Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迭代std::set创建临时对象?_C++_Stl_Iterator - Fatal编程技术网

C++ 迭代std::set创建临时对象?

C++ 迭代std::set创建临时对象?,c++,stl,iterator,C++,Stl,Iterator,我必须构建一个const_迭代器wrapper来交换带有动态绑定的泛型编程(不用管这个)。然而,std::set::const\u迭代器::operator*()给了我意想不到的东西,因为我在Derived*const&中返回它时遇到了困难,其中Derived公开继承自Base template <typename T, typename Container> class StdConstIterator : public ConstIteratable<T> { p

我必须构建一个
const_迭代器
wrapper来交换带有动态绑定的泛型编程(不用管这个)。然而,
std::set::const\u迭代器::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;
模板类stdconterator:公共可编译{
私人:
typename容器::常量迭代器;
公众:
T常量和运算符*()常量{
return*it;//g++说:警告:返回对临时对象的引用
}
};
//援引
stdconstrator-si;
虽然我认为指针复制它们而不是返回引用可能是合理的,但我在STL的实现中找不到专门化。你能解释一下这个问题吗


注意:你可能知道常规;不幸的是,没有C++11支持,因此我无法
decltype
摆脱这一困境。但这更像是一个“这里到底发生了什么?”之类的问题。

最有可能的是正在进行某种转换。您应该使用实际迭代器的值类型,而不是
T
typename Container::const\u iterator::value\u type
。如果该类型与
t
不同,则转换将创建一个临时值,您将尝试返回对该值的引用


另一方面,如果您确实需要转换,则通过值返回,
T operator*()const

@fefe:Nope,但我可以看出您如何容易地误读
typename
typedef
:)@fefe:No,
是一个变量。
it
容器::const\code>迭代器的类型,因此大概
*它属于
容器const
类型。您正在将其绑定到一个
T常量&
。如果
T
Container
或者是一个可访问的基类,那么它只是传递一个引用,从技术上来说还可以,但是如果
T
是其他东西,那么充其量只能为绑定构造一个临时类。在您的调用示例中,
T
是另一种情况。你没有给出定义,所以没什么可说的了。干杯&嗯,我想这里的主要问题是你似乎期待的那种含蓄的沮丧。啊!当然,我没有想到会有非平凡的转换来改变地址。谢谢。@bitmask:要想真正学究,你可能应该使用迭代器特性,即
std::迭代器特性::值类型
;-)我不能,因为我必须满足我正在实现的接口的纯虚拟需求。因此,我返回
ConstRefUnlessPtr::Type
,对于非指针类型,它扩展为
T const&
,对于指针类型,它扩展为
T
。说吧,称之为黑客:)@bitmask:Hm,你最近有没有检查过Boost的变换迭代器?听起来很有趣,但我认为在这种情况下没有多大帮助。