重新分配给const引用

时间:2017-12-30 01:05:42

标签: c++ reference const

使用指针我可以这样做:

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

1 个答案:

答案 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不会搞砸引用。