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&lt;int, Tstruct&gt; &amp;kv : mymap) 这是正确的代码吗?是地图的地图吗?请创建一个minimal reproducible example - 包括编译器错误。 如果&amp;kv.second 不适合myvector,按理说你应该显示myvector 是什么。您的所有答案都必须在这些信息中找到。也就是说,如果您创建minimal reproducible example,那么您很有可能会看到并能够自己解决问题。在尚未构建 MRE 的情况下提出问题通常是在浪费您的时间。 #Quimby 它改编自一个更复杂的示例,该示例使用 auto 而不是 map&lt;int, Tstruct&gt;,它最初的读法类似于 for (const auto &amp;kv : mymap) myvector.push_back(&amp;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++ 为啥我不能将此指针保存到引用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能同时实例化对基类的引用作为派生类的指针?

将此指针分配给对指针的右值引用

C++ 通过引用传递向量字符指针

为啥解引用运算符 (*) 也用于声明指针?

C++ 引用 和 指针区别

C++引用