【问题标题】: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); }

标签: c++ for-loop pointers reference


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 2013-04-29
    • 2012-09-22
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    相关资源
    最近更新 更多