首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vector<bool>::operator[]的不当行为?

vector<bool>::operator[]的不当行为?
EN

Stack Overflow用户
提问于 2013-01-30 11:56:08
回答 3查看 2.7K关注 0票数 7

可能重复: *引用不返回对bool的引用?

我曾经认为,使用std::vector::operator[],我们可以获得访问项的深度副本,但似乎并不总是正确的。至少,对于vector<bool>,下面的测试代码给出了不同的结果:

代码语言:javascript
复制
#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>特别?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-30 12:03:50

vector<bool>::operator[]既不会产生bool,也不会产生对bool的引用。它只返回一个小的代理对象,它的作用类似于一个引用。这是因为没有对单个位的引用,而且vector<bool>实际上以压缩的方式存储bool。因此,通过使用auto,您只创建了一个类似引用的对象的副本。问题是C++不知道这个对象充当引用。您必须在这里强制“衰减到值”,将auto替换为T

票数 6
EN

Stack Overflow用户

发布于 2013-01-30 11:58:26

vector<bool>是一个可怕的可憎和特殊的东西。委员会专门处理bits,因此它不支持适当的引用语义,因为您不能引用bit,这意味着它有一个不协调的接口,并且实际上不符合标准容器的条件。大多数人使用的解决方案就是永远不使用vector<bool>

票数 21
EN

Stack Overflow用户

发布于 2013-01-30 12:01:09

operator[]T的每个值返回一个T&,但bool除外,后者提供了一个引用代理。请参阅Herb的这个旧柱关于为什么在通用代码中使用vector<bool>是个坏主意(以及为什么它不是一个容器)。在有效的STL中也有一个关于它的特殊项目,由Scott,和吨的问题在这里在这里。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14603395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档