C++ 为什么我不能将这个指针保存到一个引用中?

C++ Why can I not save this pointer to a reference?

我希望获得一个指向映射的值元素(结构)的指针,并将该指针保存在一个向量中。

第二个例子有什么问题?

示例 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 循环中,kv 声明为 const,因此 kv.second 字段是 const Tstruct。获取它的地址将产生一个 const Tstruct* 指针。但是 vector 想要一个 non-const Tstruct* 指针。这就是为什么您的第一个示例有效但第二个示例失败的原因。

请注意,您的第一个示例为 vector 提供了一个指向本地 Tstruct* 变量的指针,该变量在推送后立即超出范围,使 vector 带有悬空指针.

如果 mymap 不是 const 那么 kv 不需要是 const,或者:

for (map<int, Tstruct> &kv : mymap) {
    myvector.push_back(&kv.second);