如果编译了以下代码,则clang 4(live on ideone)会生成错误消息
错误:表达式不可分配(这一个 - > ++(init.begin()))
和GCC 6.3(live on ideone)
错误:需要左值作为增量操作数(这一个 - >> ++(init.begin()))
initializer_list<T>.begin()
的返回值为const T*
,应该是完全可递增的。我在这里错过了什么?我不是问如何使代码工作,因为它很简单。我想知道为什么我的代码格式不正确。
#include <algorithm>
#include <initializer_list>
using namespace std;
int main() {
initializer_list<int> init { 1, 2, 3 };
// omit the first element and do whatever
for_each(++(init.begin()), init.end(), [](const auto & number){ /* whatever */ });
return 0;
}
答案 0 :(得分:2)
1)具有非引用返回类型的函数调用的表达式是rvalue 2)引用原始类型对象的rvalues永远不可修改 (换句话说,你不能修改基本类型的临时)
请注意,如果您使用std :: vector而不是initializer_list,结果将依赖于编译器(因为vector :: iterator可以是一个类,而可以调用非const类型的右值的成员)。
最后,我们有std :: next()表达式获取过去的一个迭代器;这也是处理任何迭代器类别的好处。