list insert为c++11返回void,原因是什么



首先是一点背景:

我一直在为一项编程作业写作,这项作业要求我解析一个文本语法文件。在本文中,我需要将std::list<string>中的占位符字符串替换为其相应的扩展(该字符串表示一个句子)。

我遍历列表,并用擦除匹配的字符串

itr = ls.erase(itr)

其中itr是迭代器,ls是我的std::list<string>

然后我插入类似的扩展

itr = ls.insert(itr, other.begin(), other.end());

其中另一个是存储扩展的容器。

我的问题是前一行显然不起作用。它应该是有效的c++11语法,我真的希望迭代器指向我刚才插入的内容的开头。但是我得到了编译错误,因为insert显然返回了void

我已经在cplusplus.com上查过了,据我所见,我没有发现我使用它的方式有任何问题。标准(或者至少我能看到的标准)规定:

iterator insert(const_iterator position, InputIterator first,
    InputIterator last);

我使用带有-std=c++11标志的g++(4.8.1)进行编译,但当我查看(gcc-directory)/include/c++/4.8.1/bits中的stl_list.h时,我看到:

void
    insert(iterator __position, _InputIterator __first,_InputIterator __last)

这仅仅是因为gcc还没有完全实现c++11库吗?他们忽略了这一点吗?这似乎并不难做到,并且围绕它的所有其他插入函数都返回一个迭代器。

我知道我可以在没有太多麻烦的情况下解决这个问题,但如果能知道发生了什么,那就太好了。

谢谢!

编辑显然这回答了我的问题。很抱歉打扰你,很遗憾我以前找不到它。

Libstdc++还没有更新为从该函数返回迭代器。

两个月前,这个补丁在subversion主干上修复了这个问题:http://gcc.gnu.org/ml/libstdc++/2013-07/msg00000.html

这个更改是在GCC 4.8.1发布之后做出的,我认为无论如何,这个更改都没有被移植到4.8分支。

最新更新