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);
我希望获得一个指向映射的值元素(结构)的指针,并将该指针保存在一个向量中。
第二个例子有什么问题?
示例 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);