关于 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()
仅返回 iterator
。
@bigxiao 这与operator ++
无关,它是对内置类型(指针、整数)和类的不同处理。调用operator ++
和其他类函数不需要左值(除非类函数是左值引用限定的)。
@bigxiao 即使它是一个明确的右值引用限定函数它仍然是一个左值。见What are “rvalue references for *this” for?。以上是关于关于 C++ 和 stl 向量的 begin() 的“需要左值作为增量操作数”的主要内容,如果未能解决你的问题,请参考以下文章