次のコードを検討してください。
#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 以外のメンバー関数を a から呼び出すことができるのconst_iterator
ですか? からの非 const メンバー関数の呼び出しを許可しない方が直感的ではありませんconst_iterator
か? iterator
const オプションを使用した sの設計は、この動作を防ぐべきではありませんか?
より重要な問題は次のとおりです。ポイント先のオブジェクトの非 const メンバー関数の呼び出しを禁止したい場合はどうすればよいでしょうか?const_iterator