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

时间:2019-07-10 18:03:40

标签: c++ pointers scope reference

我很确定我正在检索对范围内的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 s是持久的。

1 个答案:

答案 0 :(得分:2)

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

在您的情况下,*iterator返回一个std::pair<const int64, Flashcard>&,然后将其保存到std::pair<int64, Flashcard>&,因此编译器必须创建一个 temporary { {1}}在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