a を反復処理するとvector<bool>
、反復子によって逆参照された要素が const であるかのように認識されることがわかります。何故ですか?コンテナーまたは要素の型 (list<bool>
またはなど) を変更vector<short>
し、要素が非 const である。このコードは、私が話していることを示しています。
typedef bool T;
#define C vector
istringstream &operator>>(istringstream &iss, T &v)
{
cout << "non-const" << endl;
return iss;
}
istringstream &operator>>(istringstream &iss, const T &v)
{
cout << "const" << endl;
return iss;
}
istringstream &operator>>(istringstream &iss, C<T> &c)
{
for (C<T>::iterator it = c.begin(); it != c.end(); ++it)
{
iss >> *it;
}
return iss;
}
int main()
{
C<T> c(1);
istringstream iss("1");
iss >> c;
}
の場合vector<bool>
、このプログラムは「const」をコンソールに表示します。上部の typedef と manifest 定数をこれら 2 つの組み合わせ以外に変更すると、「non-const」と出力されます。また、行を , に置き換えるiss >> *it
とT v; iss >> v; *it = v;
、期待どおりに機能します。すべての組み合わせが「非定数」と出力されます。
GCC 4.1.2 C++98 (codepad.org 経由) および VS2015 C++14+ (?) でも同じ動作が見られます。