我认为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;
}
};
似乎最后一条消息存活的时间足够长,以至于可以被复制到返回值中。这是一个好的做法吗?
auto
来定义类型:messageType val = messages.back();
。 - 1201ProgramAlarmauto const& val = messages.back(); messages.pop_back(); return val;
是未定义行为,因为在到达return
时,val
引用的对象已被销毁。但是auto const val = messages.back(); messages.pop_back(); return val;
完全没有问题,因为val
是向量的最后一个元素的 副本,所以原始元素是否被销毁并不重要。 - Remy Lebeauval
不是一个引用。但在随后的代码中,它是一个引用。 - Mooing Duck