【发布时间】:2017-10-06 13:56:55
【问题描述】:
我有以下代码:
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:警告:返回对临时 [-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;
}
【问题讨论】:
-
这是对您所拥有的三元运算符的严重滥用。使用常规的
if条件来保持理智。 -
返回一个临时的引用(或指针)意味着调用者接收到一个不再存在的对象的引用。如果调用者用户引用该引用,则行为未定义。在三元表达式中使用 throw 表达式会给出与另一个表达式相同类型的默认初始化结果 - 这将是未初始化的
-
你能提供一个minimal reproducible example吗?
-
什么是
const_reference_t? -
请记住,三元运算符必须将其第二个和第三个参数的类型调整为某种常见类型。
throw ""的类型是什么?greeting[n]的类型是什么?他们常见的类型是什么?这与函数声明的返回类型有何关系?为什么代码首先使用三元运算符?使用if ... else会简单得多,因为您不必为其中一些问题感到困惑。