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_);