安全返回const和由const传递的对象?

Chr*_*eck 4 c++ pass-by-reference c++11

使用clang-3.5编译以下代码到C++ 11标准时:

const String& XMLAttributes::getValueAsString(const String& attrName, const String& def) const
{
    return (exists(attrName)) ? getValue(attrName) : def;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下警告:

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.
Run Code Online (Sandbox Code Playgroud)

g ++ - 4.9没有给出类似的警告.

我的信念是clang过于热心,在这种情况下它应该可以工作,因为我知道当使用这个函数时,输入的寿命足够长.(我很确定我已经看到了大量的代码似乎以这种方式工作......)

我对clang说它是一个"本地临时对象"这一事实感到有点震惊.真的没什么应该有一个本地的临时对象,如果clang这么认为并且在这个函数运行时删除了东西,我想知道原因.

标准是否保证此函数返回的引用(在选择"def"的情况下)将与传入的引用具有相同的生命周期,或者是否允许它们被视为两个不同的引用不同的生命周期?

Lig*_*ica 5

不,这不安全.

在这种情况下,三元条件运算符求值为其操作数的副本.因此警告.

你可以通过注入一个不错的小东西来解决它std::ref.

[C++11: 5.16/6]:第二和第三个操作数具有相同的类型; 结果是那种类型.如果操作数具有类类型,则结果是结果类型的prvalue临时值,它根据第一个操作数的值从第二个操作数或第三个操作数进行复制初始化.