【发布时间】:2015-06-20 23:58:46
【问题描述】:
当我迭代 vector<bool> 时,我发现通过迭代器取消引用的元素被识别为 const。这是为什么?更改容器或元素类型,例如list<bool> 或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+(?)中看到了相同的行为。
【问题讨论】:
-
简答:
std::vector<bool>很特别。你可以在上面找到参考,看看有什么不同。 -
是的,我,呃,刚刚注意到了。我正在写一些花哨的模板,我宁愿不专攻 bool。
-
在
vector<bool>上阅读一些有趣的事实:isocpp.org/blog/2012/11/on-vectorbool -
简短版:
vector<bool>不是容器。
标签: c++ vector boolean constants extraction-operator