C++ 不确定为什么对象是本地的而不是引用的

C++ 不确定为什么对象是本地的而不是引用的,c++,pointers,scope,reference,C++,Pointers,Scope,Reference,我很确定我正在检索范围内的Flashcard对象的引用,但IDE告诉我entry是本地对象 const ::std::pair<int64, Flashcard>& GetCardHandler::GetRandomFlashcard() { const ::std::unordered_map<int64, Flashcard>& flashcards_ = Get<FlashcardContext>()->GetFlashcard

我很确定我正在检索范围内的
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;
}

Flashcard
s在此映射中由于内部框架而持久化。
std::unordered\u映射的
value\u type
std::pair
。注意
常量
?你的声明中没有

在您的例子中,
*迭代器
返回一个
std::pair&
,然后将其保存到
std::pair&
,因此编译器必须创建一个临时
std::pair
对象,该对象是
GetRandomFlashcard()
的本地对象,然后
返回对该对象的引用。这就是编译器警告您的

您需要更新
std::pair
的声明,以包含
常量

const::std::pair&GetCardHandler::GetRandomFlashcard()
{
常量::std::无序的\u映射和抽认卡\u=Get()->GetFlashcardMap();
const::std::pair&entry=*(std::next(std::begin(flashcards),rand_-between(0,flashcards.size()));
//或者:
//常量::标准::无序映射::值类型和条目=。。。;
返回条目;
}
不过,您确实应该使用
auto
来简化您的声明:

//C++14之前的版本
const::std::pair&GetCardHandler::GetRandomFlashcard()
{
const auto&flashcards_u=Get()->GetFlashcardMap();
const auto&entry=*(std::next(std::begin(flashcards),rand_介于(0,flashcards.size())之间);
返回条目;
}
//C++14及更高版本
const auto&GetCardHandler::GetRandomFlashcard()
{
const auto&flashcards_u=Get()->GetFlashcardMap();
const auto&entry=*(std::next(std::begin(flashcards),rand_介于(0,flashcards.size())之间);
返回条目;
}
或者,至少使用一些
使用
语句来简化模板的使用:

使用FlashcardMap=::std::无序映射;
使用FlashcardMapEntry=FlashcardMap::value\u type;
...
const FlashcardMap&GetFlashcardMap();
...
抽认卡映射抽认卡由(锁定)保护;
...
常量FlashcardMapEntry&GetCardHandler::GetRandomFlashcard()
{
const FlashcardMap&flashcards_u=Get()->GetFlashcardMap();
const flashcardmappentry&entry=*(标准::下一步(标准::开始(flashcards),rand_介于(0,flashcards.size())之间);
返回条目;
}

一个
std::unordered\u映射的
值类型是
std::pair
。注意
常量
?你的声明中没有

在您的例子中,
*迭代器
返回一个
std::pair&
,然后将其保存到
std::pair&
,因此编译器必须创建一个临时
std::pair
对象,该对象是
GetRandomFlashcard()
的本地对象,然后
返回对该对象的引用。这就是编译器警告您的

您需要更新
std::pair
的声明,以包含
常量

const::std::pair&GetCardHandler::GetRandomFlashcard()
{
常量::std::无序的\u映射和抽认卡\u=Get()->GetFlashcardMap();
const::std::pair&entry=*(std::next(std::begin(flashcards),rand_-between(0,flashcards.size()));
//或者:
//常量::标准::无序映射::值类型和条目=。。。;
返回条目;
}
不过,您确实应该使用
auto
来简化您的声明:

//C++14之前的版本
const::std::pair&GetCardHandler::GetRandomFlashcard()
{
const auto&flashcards_u=Get()->GetFlashcardMap();
const auto&entry=*(std::next(std::begin(flashcards),rand_介于(0,flashcards.size())之间);
返回条目;
}
//C++14及更高版本
const auto&GetCardHandler::GetRandomFlashcard()
{
const auto&flashcards_u=Get()->GetFlashcardMap();
const auto&entry=*(std::next(std::begin(flashcards),rand_介于(0,flashcards.size())之间);
返回条目;
}
或者,至少使用一些
使用
语句来简化模板的使用:

使用FlashcardMap=::std::无序映射;
使用FlashcardMapEntry=FlashcardMap::value\u type;
...
const FlashcardMap&GetFlashcardMap();
...
抽认卡映射抽认卡由(锁定)保护;
...
常量FlashcardMapEntry&GetCardHandler::GetRandomFlashcard()
{
const FlashcardMap&flashcards_u=Get()->GetFlashcardMap();
const flashcardmappentry&entry=*(标准::下一步(标准::开始(flashcards),rand_介于(0,flashcards.size())之间);
返回条目;
}

Get()的签名是什么?另一方面,
::std
看起来非常奇怪。我觉得你发布的代码还行。
Get()
的签名是什么?顺便说一句,
::std
看起来非常奇怪。我觉得你发布的代码还行。
const ::std::unordered_map<int64, Flashcard>& GetFlashcardMap();
...
std::unordered_map<int64, Flashcard> flashcards_ GUARDED_BY(lock_);