C++ 为啥我不能将此指针保存到引用?
Posted
技术标签:
【中文标题】C++ 为啥我不能将此指针保存到引用?【英文标题】:C++ Why can I not save this pointer to a reference?C++ 为什么我不能将此指针保存到引用? 【发布时间】:2020-09-27 17:53:29 【问题描述】:我希望得到一个指向映射的值元素(结构)的指针,并将这个指针保存在一个向量中。
第二个例子有什么问题?
示例 1(编译但语义错误)
vector<Tstruct*> myvector ;
for (const map<int, Tstruct> &kv : mymap)
auto y = kv.second; // a copy
myvector.push_back(&y); // ok! &y is a Tstruct*, but this is a pointer to a copy
示例 2(未编译但旨在显示预期语义)
vector<Tstruct*> myvector ;
for (const map<int, Tstruct> &kv : mymap)
myvector.push_back(&kv.second); // &kv.second is not a valid argument here (why?)
我意识到这一定是一个新手问题,但四处搜索却无法弄清楚;我理解“X 的引用地址”=“X 的地址”,所以这似乎有点奇怪。
【问题讨论】:
for (const map<int, Tstruct> &kv : mymap)
这是正确的代码吗?是地图的地图吗?请创建一个minimal reproducible example - 包括编译器错误。
如果&kv.second
不适合myvector
,按理说你应该显示myvector
是什么。您的所有答案都必须在这些信息中找到。也就是说,如果您创建minimal reproducible example,那么您很有可能会看到并能够自己解决问题。在尚未构建 MRE 的情况下提出问题通常是在浪费您的时间。
#Quimby 它改编自一个更复杂的示例,该示例使用 auto 而不是 map<int, Tstruct>
,它最初的读法类似于 for (const auto &kv : mymap) myvector.push_back(&kv.second);
【参考方案1】:
在您的for
循环中,kv
被声明为const
,因此kv.second
字段是const Tstruct
。获取它的地址将产生一个const Tstruct*
指针。但是 vector
想要一个非常量的 Tstruct*
指针。这就是为什么您的第一个示例有效但您的第二个示例失败的原因。
请注意,您的第一个示例是给 vector
一个指向本地 Tstruct*
变量的指针,该变量在推送后立即超出范围,使 vector
带有悬空指针。
如果mymap
不是const
,那么kv
也不需要是const
:
for (map<int, Tstruct> &kv : mymap)
myvector.push_back(&kv.second);
【讨论】:
以上是关于C++ 为啥我不能将此指针保存到引用?的主要内容,如果未能解决你的问题,请参考以下文章