为什么 g++ 警告返回对临时的引用

Why does g++ warn about returning a reference to a temporary

本文关键字:引用 g++ 警告 返回 为什么      更新时间:2023-10-16

我有以下代码:

constexpr const_reference_t at(size_t p_pos) const
{
    using namespace std;
    return (p_pos > m_size)
        ? throw out_of_range{ string{ "string_view_t::at: pos > size() with pos = " } + to_string(p_pos) }
        : m_begin_ptr[p_pos];
}

在编译时,g++ 告诉我:

/

home/martin/Projekte/pluto/pluto-lib/stringview.hpp:50: Warnung: 返回对临时的引用 [-Wreturn-local-addr] : m_begin_ptr[p_pos]; ^m_begin_ptr是:

const_pointer_t m_begin_ptr = nullptr;

const_pointer_t 的类型为 const char*

此代码确实不正确还是错误警告?如果 g++ 是正确的,那为什么这是暂时的呢?最后,我怎样才能避免这个警告。

G++ 版本是 7.2.0

我进一步最小化了代码:

static const char* greeting = "hallo, world!";
const char& nth(unsigned n)
{
    return true ? throw "" : greeting[n];
}
int main()
{
    return 0;
}

当条件true (p_pos > m_size)时,你返回由throw创建的对象,根据文档创建临时对象。

异常对象是由 throw 表达式构造的未指定存储中的临时对象。

由于函数返回类型为 const char& ,即引用,因此编译器正在尝试将临时对象强制转换为引用,因此您会收到警告。

你不应该尝试返回throw的结果,你只是throw

我个人会将三元运算符部分更改为:

if (p_pos > m_size) {
    // throw
}
return m_begin_ptr[p_pos];