gpt4 book ai didi

c++ - 为什么这不会创建悬空引用?

转载 作者:行者123 更新时间:2023-12-04 11:26:04 24 4
gpt4 key购买 nike

C26830: Assigning by value when a const-reference would suffice
我认为 VS2019 建议会创建一个悬空的引用情况,但我对其进行了测试,它似乎有效。这里发生了什么?


template<typename MessageType>
class Queue {
inline static std::vector<MessageType> messages;
public:
static bool isEmpty() {
return messages.size() == 0;
}

template <typename... Args>
static void emplace(Args&&... args) {
messages.emplace_back(std::forward<Args>(args)...);
}

static MessageType pop() {
auto const& val = messages.back();
messages.pop_back();
return val;
}
};
看起来最后一条消息存活的时间足够长,可以复制到返回值中。这是好的做法吗?

最佳答案

It looks like the last message stays alive long enough to be copied into the return value. Is this good practice?


不幸的是,不,不是,也不是。 std::vector<T>::back的返回类型是一个左值引用。也许智能感知认为它是一个右值引用,在这种情况下,由于规则 here,它的生命周期会被延长。 .
但事实并非如此,这里的用法是未定义的行为。这是因为引用所指的列表中的项目已被销毁。它可能仍然有效的原因是因为该项目的内存仍然存在,因此可以正确读取。这只是运气(或不幸,如果您希望能够找到这些错误)。如果元素被 pop_back 破坏持有其他内存,那么您可能会看到不同的结果,例如 SEGFAULT。

关于c++ - 为什么这不会创建悬空引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67612546/

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