gpt4 book ai didi

c++ - 如果容器元素是指针,为什么允许我从 const_iterator 调用非 const 成员函数?

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

考虑以下代码:

#include <vector>
using namespace std;

struct foo
{
void bar()
{
}
};

int main()
{
{
vector<foo*> a;
a.push_back(new foo());
a.push_back(new foo());
a.push_back(new foo());

vector<foo*>::const_iterator itr = a.begin();
(*itr)->bar(); // compiles - this becomes more confusing
// when found in a const method. On first
// glance, one will (or at least me) may
// assume that bar() must be const if the
// method where it is being called from is
// const

// The above compiles because internally, this is what happens
// (ignore the fact that the pointer has not been newd)
foo* const * element;
(*element)->bar(); // compiles

// What I would expect however (maybe it is just me) is for const_iterator
// to behave something like this
const foo* const_element;
const_element->bar(); // compile error
}

{
vector<foo> a;
a.resize(10);

vector<foo>::const_iterator itr = a.begin();
itr->bar(); // compile error
}

}

我理解为什么它可以被调用。 const_iterator 像这样存储 const-ness:const T* 指针转换为 foo* const * 对象 foo const *

所以我的问题是,为什么我们可以从 const_iterator 调用非常量成员函数?不允许从 const_iterator 调用非常量成员函数不是更直观吗?带有 const 选项的 iterator 的设计不应该阻止这种行为吗?

现在更重要的问题是:如果我希望 const_iterator 禁止调用指向对象的非常量成员函数怎么办?

最佳答案

Shouldn't the design of iterators with the const option prevent this behaviour?

确实如此。您只是希望它是一个不同的操作。

如您所见,指针容器...包含指针,而不是对象。因此,指向此类指针的 const_iterator 意味着指针是常量,而不是它们指向的对象。

这不会改变,也不应该改变。标准库容器通常设计为包含完整的对象,而不是指针。所以他们不应该鼓励用户制作指针的 vector 和其他可疑的结构。

如果您确实需要一个vector 来包含指针,那么您应该使用一个真正设计 的容器。喜欢Boost's pointer container classes .它们的 const_iterators 使对象正确地指向 const。它们还做其他有用的事情,比如拥有它们指向的对象(以便它们被正确删除)等等。

关于c++ - 如果容器元素是指针,为什么允许我从 const_iterator 调用非 const 成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10965199/

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