这是我的代码:
class Base
{
public:
virtual void show() const = 0;
};
class Child : public Base
{
private:
static const int i = 1;
public:
virtual void show() const
{
cout << i;
}
};
map<int, const Base &> myMap{
{ 0, Child() },
{ 1, Child() },
};
Base & b = Child();
int main()
{
b.show();
myMap.at(0).show(); // This provokes the error
system("pause>NUL");
return 0;
}
正如您所看到的,我正在尝试使用
全局
(或静态
)数据,该数据将调用一些虚拟
函数。当我测试Base & b = Child();
并在main
中:b.show();
,一切都很好。但是,如果我像上面那样使用
map
,我会遇到错误:
我尝试调试这段代码,并发现当它到达
0xC0000005: 访问位置0x00000000时发生访问冲突
。
myMap.at(0).show();
时,我得到了这个:![enter image description here](https://istack.dev59.com/y7HRx.webp)
然后我尝试使用指针:
map<int, Base *>
和{0, new Child()}
。这行得通。
因此,似乎这个错误来自于临时引用。
但是我不知道为什么
b
可以工作。 b
也是一个临时引用。
在我看来,这个map
包含了许多b
。
为什么b
可以工作而map
不行呢?