错误:非const的初始值必须是左值

时间:2013-11-01 23:10:32

标签: c++ iterator lvalue

我得到一个C2440('初始化':无法从'std :: _ Vb_reference< _Alloc>'转换为'bool&'),IntelliSense会将其转换为标题中的错误。

我得到了这个错误所说的内容,而不是为什么会这么说。下面的代码产生了这个错误:

std::vector<const UINT>::iterator oIter;

oIter = std::find(vecuClassID.begin(), vecuClassID.end(), uClassID);

const UINT uDistance = std::distance(vecuClassID.begin(), oIter);

bool& refbStaticSectionInitialized = *(vecbStaticSectionInitialized.begin() + uDistance);

错误似乎发生在最后一行 - 在Visual Studio中,取消引用运算符以红色下划线。这很令人困惑,因为我的代码与CRITICAL_SECTION完全相同,并且不会产生错误:

std::vector<const UINT>::iterator oIter;

oIter = std::find(vecuClassID.begin(), vecuClassID.end(), uClassID);

const UINT uDistance = std::distance(vecuClassID.begin(), oIter);

CRITICAL_SECTION& refhStaticSection = *(vechStaticSection.begin() + uDistance);

它与bool是一个基元有关吗?

1 个答案:

答案 0 :(得分:6)

问题是std::vector<bool>没有从其下标运算符返回bool&或者解除引用它的迭代器。相反,返回的类型为std::vector<bool>::reference,这是类转换为bool&

std::vector<bool>背后的错误观念是调整界面以允许打包表示。由于某个位不可寻址,std::vector<bool>::reference可以作为一个代理。