operator[] 编译器错误和警告
Posted
技术标签:
【中文标题】operator[] 编译器错误和警告【英文标题】:operator[] compiler error and warning 【发布时间】:2015-06-30 05:22:36 【问题描述】:可能是因为我整夜没睡……但有人能解释一下为什么第一个 operator[](const 的)在 MSVC 2010 中生成警告说我正在返回临时地址变量,并且第二个 operator[](非常量)产生编译器错误,说明:'return' : cannot convert from 'std::_Vb_reference<_alloc>' to 'bool &' ?!?!?
非常感谢大家会在我的问题上浪费时间。
class ReqAtts
public:
const bool& operator[](size_t ii) const
return _atts[ii];
bool& operator[](size_t ii)
return _atts[ii];
private:
std::vector<bool> _atts;
;
【问题讨论】:
我立即注意到的一件事是,在第二个函数中,您的参数是“att”,但您将“ii”索引到数组中。std::vector<bool>
实际上在 C++ 中被视为一种特殊情况。 This answer 应该有助于解释原因。
非常感谢 huu 提供的有用链接 :)
【参考方案1】:
std::vector<bool>
在大多数实现(g++,MSVC)中是节省空间的:每个项目都可以存储为单个位,而不是布尔值。你可以在这里阅读更多:en.cppreference.com
你有两个选择:
-
使用
std::vector<unsigned char>
(或其他整数类型)代替std::vector<bool>
。
使用std::vector<bool>::reference
作为operator[]
的返回类型,如下所示:
class ReqAtts
public:
std::vector<bool>::const_reference operator[](size_t ii) const
return _atts[ii];
std::vector<bool>::reference operator[](size_t ii)
return _atts[ii];
private:
std::vector<bool> _atts;
;
【讨论】:
考虑到 _atts 向量是静态的(必须始终具有相同的维度......九,它非常小)最好的选择是使用一个好的旧 c 数组。无论如何,您的解决方案也很好:) 非常感谢!【参考方案2】:将参数 att 更改为 ii ,它将起作用
class ReqAtts
public:
const bool& operator[](size_t ii) const
return _atts[ii];
bool& operator[](size_t ii)
return _atts[ii];
private:
std::vector<bool> _atts;
;
【讨论】:
以上是关于operator[] 编译器错误和警告的主要内容,如果未能解决你的问题,请参考以下文章
编译器错误 C2280,试图引用已删除的函数 operator=
Boost interprocess flat_map operator[] 编译错误
Babel 编译错误 SyntaxError: Unexpected token when using spread operator