Why I get the following error: "returning reference to temporary [-Werror=return-local-addr]"
Why I get the following error: "returning reference to temporary [-Werror=return-local-addr]"
给定以下代码:
#include <set>
using std::set;
class Pool {
set<int> s;
public:
typedef typename set<int>::iterator Iterator;
const Iterator& begin() const {
return s.begin(); //** error
}
};
为什么会出现如下错误(我明白错误的意思,但是,我不明白为什么会出现这种情况)?
returning reference to temporary [-Werror=return-local-addr]
我该如何解决?
set<...>::begin
函数 return 其迭代器 的值 。由于您没有将该值存储在任何地方,它是一个 临时 值,您不能真正引用临时值。
简单的解决方案是您的函数 也 return 按(非常量)值。
const Iterator& begin() const {
return s.begin(); //** error
}
是非法的,因为 s.begin()
的结果是一个临时对象,因此您不能 return 引用它。也许如果您查看这段等效代码,它会更清楚吗?
const Iterator& begin() const {
Iterator it = s.begin();
return it; //** error
}
返回对迭代器的 const 引用无论如何都没有多大意义,因为您将无法移动迭代器指向的位置。你应该总是按值 return 迭代器,这样调用者就可以自由地复制迭代器并修改它们的位置。例如,如果您可以让您的代码编译,则以下调用代码将不起作用:
Pool p;
const Pool::Iterator& it = p.begin();
++it; //error it is constant
用户可以通过将您的 returned 引用复制到新对象中来修复他们的代码:
Pool p;
Pool::Iterator it = p.begin();
++it; //no error
由于您的用户将无法使用参考,因此您不能 return 最好只按值 return:
const Iterator begin() const {
return s.begin();
}
请注意,std::set
与大多数其他容器不同,不允许通过其迭代器修改值:https://en.cppreference.com/w/cpp/container/set/begin
Because both iterator and const_iterator are constant iterators (and may in fact be the same type), it is not possible to mutate the elements of the container through an iterator returned by any of these member functions.
给定以下代码:
#include <set>
using std::set;
class Pool {
set<int> s;
public:
typedef typename set<int>::iterator Iterator;
const Iterator& begin() const {
return s.begin(); //** error
}
};
为什么会出现如下错误(我明白错误的意思,但是,我不明白为什么会出现这种情况)?
returning reference to temporary [-Werror=return-local-addr]
我该如何解决?
set<...>::begin
函数 return 其迭代器 的值 。由于您没有将该值存储在任何地方,它是一个 临时 值,您不能真正引用临时值。
简单的解决方案是您的函数 也 return 按(非常量)值。
const Iterator& begin() const {
return s.begin(); //** error
}
是非法的,因为 s.begin()
的结果是一个临时对象,因此您不能 return 引用它。也许如果您查看这段等效代码,它会更清楚吗?
const Iterator& begin() const {
Iterator it = s.begin();
return it; //** error
}
返回对迭代器的 const 引用无论如何都没有多大意义,因为您将无法移动迭代器指向的位置。你应该总是按值 return 迭代器,这样调用者就可以自由地复制迭代器并修改它们的位置。例如,如果您可以让您的代码编译,则以下调用代码将不起作用:
Pool p;
const Pool::Iterator& it = p.begin();
++it; //error it is constant
用户可以通过将您的 returned 引用复制到新对象中来修复他们的代码:
Pool p;
Pool::Iterator it = p.begin();
++it; //no error
由于您的用户将无法使用参考,因此您不能 return 最好只按值 return:
const Iterator begin() const {
return s.begin();
}
请注意,std::set
与大多数其他容器不同,不允许通过其迭代器修改值:https://en.cppreference.com/w/cpp/container/set/begin
Because both iterator and const_iterator are constant iterators (and may in fact be the same type), it is not possible to mutate the elements of the container through an iterator returned by any of these member functions.