关于 C++ 和 stl 向量的 begin() 的“需要左值作为增量操作数”

Posted

技术标签:

【中文标题】关于 C++ 和 stl 向量的 begin() 的“需要左值作为增量操作数”【英文标题】:"lvalue required as increment operand" about C++ & stl vector's begin() 【发布时间】:2018-01-27 13:24:54 【问题描述】:

我正在尝试实现一个向量(就像 STL 中的那个)。 这是我的部分代码

template  <class T, class alloc>  
class vector  
  
public:  
typedef T value_type;
typedef const value_type * const_iterator;  
typedef value_type * iterator;  

iterator start;
iterator finish;
iterator end_of_storage;

iterator begin() return start;
iterator end() return finish;
...

当我尝试编译下面的代码时

vector<char> characters(2, 2);
cout << *++(characters.begin()) << endl;

错误来了

error: lvalue required as increment operand

我不确定发生了什么,我认为characters.begin() 应该是一个左值。我查看了 SGI STL 中的那个,但找不到任何东西。 非常感谢您的任何建议。

【问题讨论】:

【参考方案1】:

出现此问题是因为您使用原始指针作为迭代器。当您从函数返回原始指针(或其他原始类型,例如int)时,它不是可修改的值。然而,它可以通过使用类迭代器轻松修复:

template<typename T>
struct base_iterator

    T * m_p_value;

    base_iterator &
    operator ++(void)
    
        ++m_p_value;
        return *this;
    

    T &
    operator *(void)
    
        return *m_p_value;
    
;

// inside of vector
typedef base_iterator< value_type > iterator;  

online compiler

【讨论】:

完美运行。谢谢你的解释。 是std::vector的返回类型.begin()是右值还是左值?如果运算符++被类重载,增加的类对象是否不再需要左值? @bigxiao 是prvalue。 begin() 仅返回 iterator @bigxiao 这与operator ++ 无关,它是对内置类型(指针、整数)和类的不同处理。调用operator ++ 和其他类函数不需要左值(除非类函数是左值引用限定的)。 @bigxiao 即使它是一个明确的右值引用限定函数它仍然是一个左值。见What are “rvalue references for *this” for?。

以上是关于关于 C++ 和 stl 向量的 begin() 的“需要左值作为增量操作数”的主要内容,如果未能解决你的问题,请参考以下文章

在向量 STL C++ 中查找项目

STL推力多向量变换?

向量 C++ 上的 Memset

计算向量中存储的值的中位数 - C++?

使用 C++ 和 STL 的向量元素乘积

C++ STL 中向量的恒定时间交换逻辑