我强调引用不是指针,而是对象的别名.但是,我仍然不明白这对我作为一个程序员究竟意味着什么,即什么是引擎盖下的引用?
我认为理解这一点的最好方法是理解为什么我不能在地图中存储引用.
我知道我需要停止将引用视为指针的语法,只是不确定如何:/
是否可以在C++中使用引用作为标准映射容器中的值?
如果没有 - 为什么不呢?
示例声明:
map<int, SomeStruct&> map_num_to_struct;
Run Code Online (Sandbox Code Playgroud)
用法示例:
...
SomeStruct* some_struct = new SomeStruct();
map_num_to_struct[3] = *some_struct;
map_num_to_struct[3].some_field = 14.3;
cout<<some_struct.some_field;
...
Run Code Online (Sandbox Code Playgroud)
我希望看到14.3印刷......
对STD集合返回的元素(如地图)的引用有效期多长?
例如,在此代码中:
struct Employee{
int salary;
string name; // the key
};
map<string,Employee> allemployees;
...
Employee & Joe = allemployees["Joe Smith"];
Joe.salary=150; // change "Joe Smith"'s salary
assert(allemployees["Joe Smith"].salary==150); //always true
....
allemployees["Mark Jones"]= Employee();
... // No "Joe Smith" operations in the dots
Joe.salary=200;
assert (allemployees["Joe Smith"].salary==200); //true or not?
Run Code Online (Sandbox Code Playgroud)
}
换句话说,我从地图中获取了一个值引用.但后来我在底层地图上进行了各种其他插入,删除等操作.原值参考仍然是好的吗?其他系列呢?
而且,我怎么知道呢?我看着Stroustrup,但没有看到任何东西.
来自C背景我对引用和集合及其交互感到困惑.我应该考虑其值是参考的地图吗?这甚至意味着什么?
这是一个更普遍的问题:我在哪里可以找到这个问题和类似问题的规范性答案?
[这是已删除问题的修订版]
我跑到下面的程序,请注意,value这map是一个参考(ClassA&)-
#include <iostream>
#include <map>
using namespace std ;
class ClassA {
public :
ClassA () { cout<<"Hay ! "<<endl ; }
~ClassA () { cout<<"Bye ! "<<endl ; }
} ;
int main () {
map< string,ClassA& > myMap ;
ClassA a ;
myMap.insert( pair<string,ClassA&>("A",a) ) ;
myMap.clear() ;
}
Run Code Online (Sandbox Code Playgroud)
得到输出 -
Hay !
Bye !
Run Code Online (Sandbox Code Playgroud)
好像myMap.clear()没有受到影响因为没有人再打电话给 ClassA析构函数,你能解释一下为什么吗?
我有以下代码:
std::map<size_t,Cell&> m_cellMap;
Run Code Online (Sandbox Code Playgroud)
当Cell定义如下:
class Cell
{
public:
Cell(int x = 0,int y = 0) : m_x(x),m_y(y) { }
private:
int m_x;
int m_y;
/// class members and methods
};
Run Code Online (Sandbox Code Playgroud)
我不能编译下面的代码:
Cell c;
m_cellMap[0] = c;
Run Code Online (Sandbox Code Playgroud)
得到错误:出了error C2101: '&' on constant
什么问题?如何解决?
谢谢