gpt4 book ai didi

c++ - STL 容器中的常量和非常量

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:12:57 25 4
gpt4 key购买 nike

STL vector 模板将元素访问器定义为 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);}

编译器什么时候决定使用一个版本而不是另一个版本? vector 本身没有定义为常量,其中存储的元素也没有。所以给出两个函数:

A f(int i) const
{ return myVector[i]; }
A f(int i)
{ return myVector[i]; }

我的理解是,第一个会调用 operator[] 的 const 版本并返回一个 const A。第二个调用非常量版本并返回一个非常量 A?

对我来说,f() 的第一个版本似乎是“正确”的编写版本,因为函数没有改变任何东西,但它返回一个 const A 可能会让调用者感到惊讶。当然,如果我想要返回 const A,我需要将 f() 定义为:

const A f(int i) const    //Note the extra const at the start
{ return myVector[i]; }

这会告诉写调用者的人期待一个 const 返回。

所以额外的 const 是魔术般出现的?如果我使用的是 boost::ptr_vector 而不是 std::vector,额外的 const 会应用到什么地方?数据?指针?两者都有?

最佳答案

这利用了函数重载规则中一个棘手的部分。首先,方法原型(prototype)右括号后的 cv 限定符就像参数上的 cv 限定符,但它们适用于隐式 this 参数。在一个假设的 C++ 变体中,您必须声明 this,原型(prototype)如下所示:

reference operator[](this_type this, size_type n);
const_reference operator[](const this_type this, size_type n);

因此,如果调用方法的对象const,则第二个重载是更接近的匹配项,将被调用。如果不是,将调用第一个重载。所以如果你索引一个 const 容器,你会得到一个 const_reference ,如果你索引一个非 const,你会得到一个 reference 容器。然后,const_reference 对象强制执行它指向的容器的只读性质。

有时 const_referenceconst reference 相同,有时则不同;对于更复杂的容器,reference 是一个包含重要代码的类,对于只读类型,该代码必须不同。该标准始终使用 const_reference,以便实现者可以在需要时自由地这样做。

关于c++ - STL 容器中的常量和非常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4473981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com