首页 > 解决方案 > 为什么 --string::end() 编译但 --string.size() 不编译?

问题描述

编码

std::string str{ "foo" };
auto lastCharIndex{ --str.size() };

创建编译器错误lvalue required as decrement operand,但

auto lastCharIterator{ --str.end() };

才不是。为什么是这样?

标签: c++decrement

解决方案


string::size按值返回标量类型(某种整数),并且--不允许在纯右值上使用内置前缀表达式。相比之下,对于本质上只是函数的重载运算符(在用户定义的类型上),则不适用此类限制。因此是否--str.end()允许取决于string::iterator是用户定义类型(某种类类型)还是标量类型(例如指针)。但是,这没有指定,甚至可能因优化设置而异。


推荐阅读