不知道为什么对象是本地的还是引用的
not sure why object is local vs 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
是持久的。
std::unordered_map
的value_type
是std::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;
}
相关文章:
- C++取消引用指针.为什么会发生变化
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 为什么我可以通过引用修改常量返回
- 为什么可以将左值传递给"std::async",即使它引用了右值
- 为什么引用传递会导致此崩溃(C++)
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 通过引用传递-为什么要调用这个析构函数
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 为什么常量方法可以采用非常量引用?
- 为什么当我们有常量引用时创建临时对象?
- 为什么我不能将引用作为 std::async 的函数参数传递
- 在 std::函数捕获中悬空引用.为什么是未定义的行为?
- 如果不允许我分配 rvalues 来引用为什么以下代码片段有效,这在内部如何工作?
- 返回引用 - 为什么我的代码工作正常?不应该
- C++中有哪些不同类型的指针和引用?为什么它们有用
- 初始化C++引用-为什么不使用运算符的地址
- 指向根的二叉树指针需要被引用和解引用.为什么