gpt4 book ai didi

C++ map,使用 const 引用作为值类型,这里有什么问题?

转载 作者:行者123 更新时间:2023-12-03 06:57:41 27 4
gpt4 key购买 nike

今天我看到我老板的代码使用 const 引用作为 map的值类型。
这是代码:

class ConfigManager{
public:
map<PB::Point, const PB::WorldPoint&, compare_point> world_point;
//the rest are omitted
};
( PB 是 Google Protobuf,我们正在使用 Protobuf 库。我不太了解它或者它是否与问题相关。)
这个类所做的是它读取一些配置文件并将其放入一些 map s 用于搜索。

起初我很惊讶,因为我没有看到 map以引用作为其值,例如 map<int, classA&> aMap .
所以然后我搜索了SO,这两个问题告诉我我不能这样做。
C++: Is it possible to use a reference as the value in a map?
STL map containing references does not compile
然后我尝试了这段代码,确实它没有编译:
代码示例1
struct A {
int x = 3;
int y = 4;
};

map<int, A&> myMap;

int main() {
A a;
myMap.insert(make_pair(1, a));
}
但如果我改变 map<int, A&> myMap;map<int, const A&> myMap; ,它编译。
又出现了一个问题。与 map<int, const A&> myMap; , 我不能使用 []得到这对,但我可以使用 map.find() .
(在我告诉他使用 map.find() 无法编译后,我的老板告诉我使用 [])。
代码示例2
struct A {
int x = 3;
int y = 4;
};

map<int, const A&> myMap;

int main() {
A a;
myMap.insert(make_pair(1, a));

//can't compile
cout << myMap[1].x << " " << myMap[1].y << endl;

//can work
//auto it = myMap.find(1);
//cout << it->second.x << " " << it->second.y << endl;
}
所以直到这里我都认为我的老板是正确的。他的代码是正确的。

最后一个故事是我把代码展示给了一些在线 friend 。他们注意到了一个问题。
代码示例3
#include <map>
#include <iostream>
#include <string>
using namespace std;

struct A {
int x = 3;
int y = 4;
~A(){
cout << "~A():" << x << endl;
x = 0;
y = 0;
}
};

map<string, const A&> myMap;

int main() {
A a;
cout << a.x << " " << a.y << endl;
myMap.insert(make_pair("love", a));
a.x = 999;
cout << "hello" << endl;
auto s = myMap.find("love");
cout << s->second.x << " " << s->second.y << endl;
}
输出是:
3 4
~A():3
hello
0 0
~A():999
如果我正确理解了输出(如果我弄错了,请纠正我),这表明:
  • make_pair("love", a)创建一个对象 pair<"love", temproray copy of a> .这对得到inserted进入 myMap .
  • 不知何故,我不知道它是怎么发生的,temporary copy of a立即被破坏。对我来说,这意味着 temporary copy of a 的内存。现在不属于任何人,如果我理解正确,它现在是一个可用的内存空间,可以填充任何值。

  • 所以现在我又开始困惑了。
    我的问题是:
  • 会发生什么?代码示例3 ?我的理解正确吗?为什么temporary copy of a声明后立即销毁?是不是使用 const 引用可以延长临时的生命周期?我的意思是,我认为它不应该被破坏,直到 main完成。
  • 我老板的代码不正确而且很危险吗?
  • 最佳答案

    Why does temporary copy of a get destructed right after the statement?


    因为(在大多数情况下)这就是临时工的工作方式。直到创建它们的语句结束为止。临时生命周期的延长不适用于这种情况,见 here . TLDR 版本是

    In general, the lifetime of a temporary cannot be further extended by"passing it on": a second reference, initialized from the reference towhich the temporary was bound, does not affect its lifetime.


    can I use const reference as a map's value type?


    是的,只要您意识到向映射添加 const 引用对所引用对象的生命周期没有影响。您的老板代码也不正确,因为 make_pair 返回的临时代码在语句结束时被销毁。

    关于C++ map,使用 const 引用作为值类型,这里有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64482960/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com