※ ChatGPTを利用し、要約された質問です(原文:C++ iteator const を使ったプログラムがコンパイルできない)
C++ iteator const を使ったプログラムがコンパイルできない
C++ iteator const を使ったプログラムがコンパイルできない
以下のプログラムがコンパイルできません。
理由もよく分かりません。
-----------------
#include <algorithm>
#include <list>
struct Hoge {
std::list<Hoge*> l;
Hoge * f() const {
std::list<Hoge*>::iterator i = l.begin();
return 0;
}
};
--------------------
g++ 4.1.1 を使っていますが
% g++ -c test1.cc
test1.cc: In member function 'Hoge* Hoge::f() const':
test1.cc:8: error: conversion from 'std::_List_const_iterator<Hoge*>' to non-scalar type 'std::_List_iterator<Hoge*>' requested
となります。
l.begin() が const で代入できないということだと思うのですが
std::list<Hoge*> l;
の部分には const を使っていませんし良く分かりません。
また、 Hoge * eval() const { の const を消すか、
std::list<Hoge*>::iterator i = l.begin(); の代入をやめると
コンパイルが通ります。
const は return するポインタの先の領域を変更不可にしている
と解釈しているのですが、戻り値と関係ない代入がどうして影響を受けるのかが謎です。
(実際は、もう少し違う大きいプログラムですが関係なさそうな部分を削って
上でも同様のエラーメッセージが出ることを確認しました。)
お礼
コンパイルできました。 ありがとうございます。 > std::list<Hoge*>::const_iterator i = l.begin(); こういう型があるのですね。 std::list<const Hoge*>::iterator std::list<Hoge* const>::iterator などとは試してみたのですが あと僕は、 Hoge * f() const { の意味を勘違いしていました。 これは、戻り値がconstということでなくて このメンバ関数の中でメンバ変数を変更できない という意味なんですね。 これなら、iterator がconstでないといけない理由に納得がいきます。