STL向量模板将元素访问器定义为const和非const变体,例如:
reference operator[](size_type __n)
{return *(this->_M_impl._M_start + __n);}
const_reference operator[](size_type __n) const
{return *(this->_M_impl._M_start + __n);}
Run Code Online (Sandbox Code Playgroud)
什么时候编译器决定使用一个版本而不是另一个版本?向量本身未定义为const,也不存储在其中的元素.所以有两个功能:
A f(int i) const
{ return myVector[i]; }
A f(int i)
{ return myVector[i]; }
Run Code Online (Sandbox Code Playgroud)
我的理解是,第一个将调用operator []的const版本并返回一个const A.第二个调用非const版本并返回一个非const A?
对我来说,f()的第一个版本似乎是"正确的"写入,因为函数没有改变任何东西,但是调用者可能会惊讶于它返回一个const A.当然如果我想要一个const返回,我应该将f()定义为:
const A f(int i) const //Note the extra const at the start
{ return myVector[i]; }
Run Code Online (Sandbox Code Playgroud)
哪个会告诉谁打算调用者期望一个const回来.
所以额外的const出现了魔法?如果我使用boost :: ptr_vector而不是std :: vector,那么额外的const应用于什么?数据?指针?都?
这利用了函数重载规则的棘手部分.首先,在方法原型的近括号之后的cv限定符就像参数上的cv-qualifiers一样,但它们适用于隐式this参数.在您必须声明的假设C++变体中this,原型将是这样的:
reference operator[](this_type this, size_type n);
const_reference operator[](const this_type this, size_type n);
Run Code Online (Sandbox Code Playgroud)
因此,如果您正在调用方法的对象是const,则第二个重载是更接近的匹配并将被调用.如果不是,则会调用第一个重载.因此,const_reference如果您为const容器编制索引,则会reference返回,如果索引非const容器,则会返回.const_reference然后,该对象强制执行它指向的容器的只读属性.
有时const_reference是相同的const reference,有时却不是; 对于更复杂的容器,a reference是一个具有重要代码的类,并且该代码必须与只读类别不同.该标准始终如一地使用,const_reference以便实现者可以在需要时自由地执行此操作.
| 归档时间: |
|
| 查看次数: |
2058 次 |
| 最近记录: |