gpt4 book ai didi

c++ - 对结构成员的临时绑定(bind)引用

转载 作者:行者123 更新时间:2023-12-02 07:39:25 25 4
gpt4 key购买 nike

我在一些代码库上尝试 Coverity,并且收到了类似于代码的警告

struct Foo
{
std::string name;
};

Foo getFoo();
//...
const auto& name = getFoo().name;
useName(name);

此代码有效吗?

我的直觉是它确实无效。但是,当我寻找证据时,我遇到了 [class.temporary]/6.4 ,这似乎表明它实际上是格式良好的。然而,Coverity 发出了警告,Coverity 肯定是由一些聪明的人编写的,他们可以比我更好地解释该标准。

发出的具体 Coverity 警告是

Dereferencing the returned or out-of-scope stack pointer will access an invalid location on the stack after its scope or after the function returns.

In whateverSurroundingFunction(): Pointer to a local stack variable returned or used outside scope (CWE-562)

关于名称的后续使用。前面的警告是

out_of_scope: Temporary variable of type Foo goes out of scope

MRE 的一种是 this (感谢评论中的@user4581301)。

<小时/>

SO 有很多关于临时绑定(bind)引用的问题,但我看到的每个问题都有稍微不同的上下文,因此这里又出现了关于它们的另一个问题。

最佳答案

该代码格式良好。正如链接标准所述,lifetime of the temporary getFoo() 返回的值将被延长到引用变量 name 的生命周期。

(强调我的)

Whenever a reference is bound to a temporary or to a subobject thereof, the lifetime of the temporary is extended to match the lifetime of the reference

引用直接绑定(bind)到临时 Foo子对象 name,然后生命周期就会延长。其他方式,例如通过返回对数据成员的引用的成员函数绑定(bind)引用将不起作用。

struct Foo
{
std::string name;
std::string& get_name() { return name; }
};

Foo getFoo();

然后

const auto& name = getFoo().get_name();
std::cout << name << std::endl; // UB; name is dangled

LIVE

关于c++ - 对结构成员的临时绑定(bind)引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61743592/

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