当我遍历 avector<bool>
时,我发现通过迭代器取消引用的元素被识别为就好像它们是 const 一样。这是为什么?更改容器或元素类型,例如list<bool>
or vector<short>
,并且元素是非常量的。这段代码显示了我在说什么:
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 常量更改为除了这两个组合之外的任何内容,它会打印“非常量”。此外,如果我将 , 行替换为iss >> *it
,T v; iss >> v; *it = v;
它会按预期工作——所有组合都会打印“非常量”。
我在 GCC 4.1.2 C++98(通过 codepad.org)和 VS2015 C++14+(?)中看到了相同的行为。