【问题标题】:return reference to temporary when dereferencing map iterator取消引用映射迭代器时返回对临时的引用
【发布时间】:2018-09-02 21:56:06
【问题描述】:

考虑这段代码

#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 没问题?

【问题讨论】:

    标签: c++ dictionary iterator warnings


    【解决方案1】:

    问题是std::map&lt;int,int&gt;value_type不是std::pair&lt;int,int&gt;,而是std::pair&lt;const int,int&gt;。然后对于return *it;,必须创建并返回一个临时的std::pair&lt;int,int&gt;。 (std::pair&lt;int,int&gt; 可以是来自std::pair&lt;const int,int&gt;converted。)临时将立即被销毁,并让返回的引用悬空。

    要解决此问题,您可以将返回类型更改为 const std::pair&lt;const int,int&gt;&amp;const std::map&lt;int,int&gt;::value_type &amp;

    【讨论】:

    • 您的意思是“必须创建并返回一个临时的std::pair&lt;int,int&gt;”?
    猜你喜欢
    • 1970-01-01
    • 2022-10-25
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多