可能重复: *引用不返回对bool的引用?
我曾经认为,使用std::vector::operator[],我们可以获得访问项的深度副本,但似乎并不总是正确的。至少,对于vector<bool>,下面的测试代码给出了不同的结果:
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
void Test(const T& oldValue, const T& newValue, const char* message)
{
cout << message << '\n';
vector<T> v;
v.push_back(oldValue);
cout << " before: v[0] = " << v[0] << '\n';
// Should be a deep-copy (?)
auto x = v[0];
x = newValue;
cout << " after: v[0] = " << v[0] << '\n';
cout << "-------------------------------\n";
}
int main()
{
Test<int>(10, 20, "Testing vector<int>");
Test<double>(3.14, 6.28, "Testing vector<double>");
Test<bool>(true, false, "Testing vector<bool>");
}输出(用VC10 10/SP1 2010 SP1编译的源代码):
测试向量之前:v= 10之后:v= 10
我原以为在v[0]赋值之后的x = newValue仍然等于以前的值,但这似乎不是真的。为什么会这样呢?为什么vector<bool>特别?
发布于 2013-01-30 12:03:50
vector<bool>::operator[]既不会产生bool,也不会产生对bool的引用。它只返回一个小的代理对象,它的作用类似于一个引用。这是因为没有对单个位的引用,而且vector<bool>实际上以压缩的方式存储bool。因此,通过使用auto,您只创建了一个类似引用的对象的副本。问题是C++不知道这个对象充当引用。您必须在这里强制“衰减到值”,将auto替换为T。
发布于 2013-01-30 11:58:26
vector<bool>是一个可怕的可憎和特殊的东西。委员会专门处理bits,因此它不支持适当的引用语义,因为您不能引用bit,这意味着它有一个不协调的接口,并且实际上不符合标准容器的条件。大多数人使用的解决方案就是永远不使用vector<bool>。
发布于 2013-01-30 12:01:09
operator[]为T的每个值返回一个T&,但bool除外,后者提供了一个引用代理。请参阅Herb的这个旧柱关于为什么在通用代码中使用vector<bool>是个坏主意(以及为什么它不是一个容器)。在有效的STL中也有一个关于它的特殊项目,由Scott,和吨的问题在这里在这里。
https://stackoverflow.com/questions/14603395
复制相似问题