鉴于此定义:
vector<some_struct_t> lots_of_stuff;
vector::at
返回引用的事实,这段代码对我有意义:
some_struct_t & ref_element = lots_of_stuff.at(0);
但是,这段代码也可以编译并且似乎有效:
some_struct_t val_element = lots_of_stuff.at(0);
如何在这里进行非参考工作?是否正在调用复制构造函数?为什么这样做?
答案 0 :(得分:6)
非参考文件从返回的对象引用中复制。对象中的对象的更改不会应用于向量中的对象,如引用版本所做的那样。
答案 1 :(得分:0)
类型T的引用只是类型T的左值表达式,就像类型T的变量名称是T的左值表达式一样。所以......
vector<T> v = ...;
T a = ...;
T b = a;
T c = v.at(0);
b和c的初始化方式几乎没有区别,因为在右侧只是一个类型为T的左值表达式,这导致了复制初始化。
我认为你提出这个问题的原因是你认为引用本身就是一个对象类型,就像指针的类型是一个对象类型。但这种情况并非如此。表达式从不具有引用类型。引用类型仅用于将rvalue转换为左值表达式。表达式的类型是相同的。但它的“价值范畴”发生了变化。