使用指针我可以这样做:
int a=1;
int b=2;
const int* cnstIntPtr = &a;
// (*cnstIntPtr)++ does not work, makes sense since value pointed to is constant
cnstIntPtr = &b; // works, makes sense
const int* const cnstIntCnstPtr = &a;
// (*cnstIntCnstPtr)++; does not work, makes sense since value pointed to is constant
// cnstIntCnstPtr = &b; does not work, makes sense since pointer is constant
但有参考资料:
const int& cnstIntRef = a;
// cnstIntRef++; does not work, makes sense since const refers to value at address
// cnstIntRef = b; why does this not work? "expression must be modifiable lvalue"
const int& const cnstIntCnstRef = a;
//cnstIntCnstRef++; does not work, makes sense since const refers to value at address
//cnstIntCnstRef = b; does not work, makes sense since const refers to value at address
那么,当const应该引用地址的值时(为了类似于指针的工作方式),为什么我不能重新分配给const引用。如果这通常是不可能的,那为什么呢?
中第二个const的含义是什么 const int& const cnstIntCnstRef
?
答案 0 :(得分:1)
// cnstIntRef = b; why does this not work? "expression must be modifiable lvalue"
出于与cnstIntRef++;
无效的原因相同的原因。 cnstIntRef
是对const的引用,因此可能不会将该值赋给。
如果这通常是不可能的,那为什么呢
确实不可能。
引用与指针不同:它们会自动解除引用。对引用变量的赋值是对引用对象的赋值。正如您了解cnstIntRef++
类似于(*cnstIntPtr)++
,您也必须明白cnstIntRef = a
类似于*cnstIntPtr = a
。
因此,没有语法来重新分配"引用另一个对象的引用。引用始终在整个生命周期中始终引用一个对象。
中第二个const的含义是什么
const int& const cnstIntCnstRef?
它没有任何意义,因为它是不正确的。与指针不同,限定符可能不适用于引用;它们可能只适用于推荐类型。
然后我该如何处理
std::vector<const int&>
您无法处理std::vector<const int&>
,因为const int&
不是std::vector
元素的有效类型。 Vector要求元素可擦除。参考文献不可删除。
我需要做的是设置它的大小,稍后在构造函数体中填充元素。
您可以使用指针向量。或std::reference_wrapper
的向量,如果它更方便用于模板目的。
如果你先push_back是不可能的,因为它弄乱了参考文献
push_back
, reserve
不会搞砸引用。