考虑这段代码
#include <iterator>
#include <vector>
const int& foo(const std::vector<int>& x,unsigned i) {
auto it = x.begin();
std::advance(it,i);
return *it;
}
clang和gcc都没有发出错误/警告,但是这个:
#include <iterator>
#include <map>
const std::pair<int,int>& bar(const std::map<int,int>& x,unsigned i){
auto it = x.begin();
std::advance(it,i);
return *it;
}
使用clang编译并使用-Werror
结果:
<source>:14:12: error: returning reference to local temporary object [-Werror,-Wreturn-stack-address]
return *it;
^~~
和gcc:
<source>: In function 'const std::pair<int, int>& bar(const std::map<int, int>&, unsigned int)':
<source>:14:13: error: returning reference to temporary [-Werror=return-local-addr]
return *it;
^~
是什么让gcc和clang拒绝bar
以及为什么foo
没问题?
答案 0 :(得分:7)
问题是std::map<int,int>
的value_type
不是std::pair<int,int>
,而是std::pair<const int,int>
。然后,对于return *it;
,必须创建并返回临时std::pair<int,int>
。 (std::pair<int,int>
可能是来自std::pair<const int,int>
的{{3}}。)临时文件将立即销毁,并将返回的参考文件悬空。
要解决问题,您可以将返回类型更改为const std::pair<const int,int>&
或const std::map<int,int>::value_type &
。