尝试增加initializer_list.begin()

时间:2017-10-06 09:58:05

标签: c++ c++11

如果编译了以下代码,则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;
} 

1 个答案:

答案 0 :(得分:2)

1)具有非引用返回类型的函数调用的表达式是rvalue 2)引用原始类型对象的rvalues永远不可修改 (换句话说,你不能修改基本类型的临时)

请注意,如果您使用std :: vector而不是initializer_list,结果将依赖于编译器(因为vector :: iterator可以是一个类,而可以调用非const类型的右值的成员)。

最后,我们有std :: next()表达式获取过去的一个迭代器;这也是处理任何迭代器类别的好处。