我很确定我正在检索对范围内的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是持久的。
答案 0 :(得分:2)
value_type
中的std::unordered_map
是std::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