gpt4 book ai didi

c++ - 可以安全地将 const & 返回给 const & 传递的对象吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:30 26 4
gpt4 key购买 nike

使用 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”的情况下)与传入的引用具有相同的生命周期,或者是否允许将它们视为两个具有不同生命周期的不同引用?

最佳答案

不,这不安全。

在这种情况下,三元条件运算符计算为其操作数的拷贝。因此警告。

您可能可以通过注入(inject)一个漂亮的小std::ref 来解决它。

[C++11: 5.16/6]: The second and third operands have the same type; the result is of that type. If the operands have class type, the result is a prvalue temporary of the result type, which is copy-initialized from either the second operand or the third operand depending on the value of the first operand.

关于c++ - 可以安全地将 const & 返回给 const & 传递的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30518893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com