根据这个定义:
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);非引用如何在这里工作?是否正在调用复制构造函数?为什么这是可行的?
发布于 2011-02-06 16:22:04
T类型的引用就是T类型的左值表达式,就像T类型的变量名是T的左值表达式一样。
vector<T> v = ...;
T a = ...;
T b = a;
T c = v.at(0);B和c的初始化方式几乎没有区别,因为在右边是一个简单的T类型的左值表达式,这会导致复制初始化。
我认为你问这个问题的原因是你认为引用本身就是一个对象类型,就像指针的类型是一个对象类型一样。但事实并非如此。表达式永远不会有引用类型。引用类型只是用来将右值转换为左值表达式。表达式的类型是相同的。但它的“价值范畴”发生了变化。
发布于 2011-02-06 10:49:18
非引用的对象从返回的引用复制到您的对象。与参考版本不同,对对象所做的更改不会应用于矢量中的对象。
https://stackoverflow.com/questions/4911187
复制相似问题