【发布时间】:2015-08-11 16:32:42
【问题描述】:
使用 clang-3.5 将以下代码编译为 C++11 标准时:
const String& XMLAttributes::getValueAsString(const String& attrName, const String& def) const
{
return (exists(attrName)) ? getValue(attrName) : def;
}
我收到以下警告:
warning:
returning reference to local temporary object [-Wreturn-stack-address]
return (exists(attrName)) ? getValue(attrName) : def;
^~~
note:
binding reference variable 'def' here
...String& attrName, const String& def) const
^
1 warning generated.
g++-4.9 没有给出类似的警告。
我认为 clang 过于热心并且在这种情况下它应该可以正常工作,因为我知道当使用这个函数时,输入有足够长的生命周期。 (我很确定我已经看到了大量似乎以这种方式工作的代码......)
不过,clang 说它是“本地临时对象”这一事实让我有点害怕。真的没有应该有一个本地临时对象,如果clang这么认为并且在这个函数运行时正在删除东西,我想知道为什么。
标准是否保证此函数返回的引用(在选择“def”的情况下)与传入的引用具有相同的生命周期,或者是否允许将它们视为两个不同生命周期的不同引用?
【问题讨论】:
-
它有签名
const String& XMLAttributes::getValue(const String& attrName) const所以我想这不是问题
标签: c++ c++11 pass-by-reference