使用const/nonconst版本在C++中的模板类上重载[]运算符

riw*_*alk 10 c++ templates return-by-reference

哇,这是一个很长的头衔.

这是我的问题.我在C++中有一个模板类,我正在重载[]运算符.我有一个const和一个非const版本,非const版本通过引用返回,以便类中的项可以更改为:

myobject[1] = myvalue;
Run Code Online (Sandbox Code Playgroud)

这一切都有效,直到我使用布尔值作为模板参数.这是一个显示错误的完整示例:

#include <string>
#include <vector>
using namespace std;

template <class T>
class MyClass
{
    private:
        vector<T> _items;

    public:

        void add(T item)
        {
            _items.push_back(item); 
        }

        const T operator[](int idx) const
        {
            return _items[idx];
        }

        T& operator[](int idx)
        {
            return _items[idx];
        }

};


int main(int argc, char** argv)
{
    MyClass<string> Test1;      //  Works
    Test1.add("hi");
    Test1.add("how are");
    Test1[1] = "you?";


    MyClass<int> Test2;         //  Also works
    Test2.add(1);
    Test2.add(2);
    Test2[1] = 3;


    MyClass<bool> Test3;        // Works up until...
    Test3.add(true);
    Test3.add(true);
    Test3[1] = false;           // ...this point. :(

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该错误是编译器错误,消息是:

error: invalid initialization of non-const reference of type ‘bool&’ from a temporary of type ‘std::_Bit_reference’
Run Code Online (Sandbox Code Playgroud)

我已经阅读并发现STL使用了一些临时数据类型,但我不明白为什么它适用于除bool之外的所有内容.

任何有关这方面的帮助将不胜感激.

Fre*_*son 9

因为vector<bool>专门用于STL,并不实际满足标准容器的要求.

Herb Sutter在GOTW文章中更多地讨论了它:http://www.gotw.ca/gotw/050.htm


Mic*_*fik 6

A vector<bool>不是真正的容器.您的代码有效地尝试返回对单个位的引用,这是不允许的.如果您将容器更改为a deque,我相信您会得到您期望的行为.


小智 5

A vector<bool>没有像所有其他向量一样实现,也不像它们那样工作.你最好不要使用它,不要担心你的代码是否无法处理它的许多特性 - 它主要被认为是一件坏事,被一些不假思索的C++标准委员会成员强加给我们.