不知道为什么对象是本地的还是引用的

not sure why object is local vs reference

本文关键字:引用 为什么 对象 不知道      更新时间:2023-10-16

我很确定我正在检索对范围内Flashcard对象的引用,但 IDE 告诉我entry是一个本地对象。

const ::std::pair<int64, Flashcard>& GetCardHandler::GetRandomFlashcard() {
  const ::std::unordered_map<int64, Flashcard>& flashcards_ = Get<FlashcardContext>()->GetFlashcardMap();
  const ::std::pair<int64, Flashcard>& entry  = *( std::next(std::begin(flashcards_), rand_between(0, flashcards_.size()) ) ); ;
  return entry;
}

更多上下文(来自FlashcardContext类(...

const ::std::unordered_map<int64, Flashcard>& GetFlashcardMap();
...
std::unordered_map<int64, Flashcard> flashcards_ GUARDED_BY(lock_);

由于内部框架,此映射中的Flashcard是持久的。

std::unordered_mapvalue_typestd::pair<const Key, T> 。注意到const了吗? 您的声明中缺少它。

在你的例子中,*iterator返回一个std::pair<const int64, Flashcard>&,然后你将其保存到一个std::pair<int64, Flashcard>&,所以编译器必须创建一个临时std::pair对象,该对象是GetRandomFlashcard()本地的,然后你return引用它。 这就是编译器警告您的内容。

您需要更新您的std::pair声明以包含以下const

const ::std::pair<const int64, Flashcard>& GetCardHandler::GetRandomFlashcard()
{
    const ::std::unordered_map<int64, Flashcard>& flashcards_ = Get<FlashcardContext>()->GetFlashcardMap();
    const ::std::pair<const int64, Flashcard>& entry = *( std::next(std::begin(flashcards_), rand_between(0, flashcards_.size()) ) );
    // alternatively:
    // const ::std::unordered_map<int64, Flashcard>::value_type& entry = ...;
    return entry;
}

但是,您确实应该利用auto来简化声明:

// pre-C++14
const ::std::pair<const int64, Flashcard>& GetCardHandler::GetRandomFlashcard()
{
    const auto &flashcards_ = Get<FlashcardContext>()->GetFlashcardMap();
    const auto &entry = *( std::next(std::begin(flashcards_), rand_between(0, flashcards_.size()) ) );
    return entry;
}
// C++14 and later
const auto & GetCardHandler::GetRandomFlashcard()
{
    const auto &flashcards_ = Get<FlashcardContext>()->GetFlashcardMap();
    const auto &entry = *( std::next(std::begin(flashcards_), rand_between(0, flashcards_.size()) ) );
    return entry;
}

或者,至少使用一些using语句来简化模板的使用:

using FlashcardMap = ::std::unordered_map<int64, Flashcard>;
using FlashcardMapEntry = FlashcardMap::value_type;
...
const FlashcardMap& GetFlashcardMap();
...
FlashcardMap flashcards_ GUARDED_BY(lock_);
...
const FlashcardMapEntry& GetCardHandler::GetRandomFlashcard()
{
    const FlashcardMap& flashcards_ = Get<FlashcardContext>()->GetFlashcardMap();
    const FlashcardMapEntry& entry = *( std::next(std::begin(flashcards_), rand_between(0, flashcards_.size()) ) );
    return entry;
}