在C+中实现类似映射的迭代器时出现问题+; 我刚刚完成C++中的一个通用跳过列表,我想把它带来一个 类似STL映射的迭代器。 重载“->”运算符时会出现问题:需要返回对迭代器::value_类型的引用,在我的例子中,它是std::pair,K是类映射容器的键类型,V是类映射容器的值类型。 代码如下: value_type& operator->() { return value_type(inner->key, inner->value); }

在C+中实现类似映射的迭代器时出现问题+; 我刚刚完成C++中的一个通用跳过列表,我想把它带来一个 类似STL映射的迭代器。 重载“->”运算符时会出现问题:需要返回对迭代器::value_类型的引用,在我的例子中,它是std::pair,K是类映射容器的键类型,V是类映射容器的值类型。 代码如下: value_type& operator->() { return value_type(inner->key, inner->value); },c++,iterator,C++,Iterator,编译器返回一些关于临时对象引用的消息,我 完全同意他,;我的问题是:我该怎么做才能返回推荐信 在我的迭代器类中不必放置一个pair成员就可以创建pair?在snipped中,您正在创建一个value\u类型的新实例。这个对象当然会在函数/方法操作符->()离开后被删除,这会使您刚才返回的引用指向任何地方 您应该做的是返回对列表中已存在的适当元素的引用 value_type& operator->() { return value_type(inner->key, inner-

编译器返回一些关于临时对象引用的消息,我 完全同意他,;我的问题是:我该怎么做才能返回推荐信
在我的迭代器类中不必放置一个pair成员就可以创建pair?

在snipped中,您正在创建一个value\u类型的新实例。这个对象当然会在函数/方法操作符->()离开后被删除,这会使您刚才返回的引用指向任何地方

您应该做的是返回对列表中已存在的适当元素的引用

value_type& operator->() { return value_type(inner->key, inner->value); }
您的返回类型是对
值\u类型的引用,但您返回一个本地创建的实例,该实例将在函数/运算符作用域的末尾(即关闭
}
)被销毁,因此您返回一个垃圾引用,这就是编译器讨厌您的原因

如果您改为按值返回,您将拥有正确的功能代码。(是否应按值返回取决于
value\u type
的类型)


更好的做法是将一个
值\u type
作为类的成员字段,但您说不想这样做,因此这是唯一其他现实的选择。

首先,
操作符->
应该返回指针,或者有自己的
操作符->()
方法的对象。但是,如果没有存储
值类型
,即
,则无法轻松返回指向它的指针

您能否更改
内部
的定义,使其成为或包含
?您可以在中添加诸如
key()
value()
之类的访问器,以避免在大多数地方混淆
first
second

或者,根据您需要它来执行操作的程度,可能您应该使用不同的
value\u type
typedef来描述您实际拥有的内容。

运算符->()应该只返回指针值或为其定义了重载运算符->()函数的值。此函数的作用不是执行'->'操作本身,而是提供'->'运算符将对其进行操作的对象或指针


在您的情况下,要实现这一点,您需要返回一个指向pair的指针。如果您确实希望避免将该对存储在类中,则可以让函数返回一个指向新分配对的智能指针,这样在操作过程中就不会发生内存泄漏。

好的,我错过了这一点,我认为需要返回一个引用。我还有一个与map迭代器相关的问题,这个问题稍微偏离了我的初始问题:为什么像map one这样的STL迭代器的值类型是std::pair而不是std::pair。为什么要多复制一份键和值,而不是只返回对它们的引用?因为强制执行这样的仅引用的契约通常比强制执行仅值的契约更复杂、更脆弱或更昂贵。但是使用引用而不是值是否被认为是不好的做法?一些STL算法会停止工作吗?也许你应该阅读C++参考文献,它们是什么,它们是如何工作的,以及它们的用途。也许我没有很好地阐述我的问题。我想知道的是,使用引用作为迭代器返回的对的组件被认为是一个糟糕的设计,并且违背C++习惯用法,如果是,为什么?
value_type operator->() { return value_type(inner->key, inner->value); }