6

根据cppreference,C++11 应该支持:

template< class InputIt >
iterator insert( const_iterator pos, InputIt first, InputIt last );

但是当我尝试使用 g++ 4.9.2 编译以下代码时:

std::string str{ "hello world" }, addition{ "h my" };
auto iter = str.erase(str.begin(), str.begin() + 4);
iter = str.insert(next(iter), addition.begin(), addition.end()); // Error

我收到以下错误(现场示例):

error: no match for 'operator=' (operand types are '__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >' and 'void')
 iter = str.insert(next(iter), addition.begin(), addition.end());
      ^

但是,Visual Studio 2013 和 Clang 似乎没有问题。

4

1 回答 1

3

gcc 使用了不符合要求的写时复制 (COW)实现,4.9.2他们对其进行了系列更改5.x,我们可以从实时的 Godbolt 会话中看到,这已被破坏4.9.2但可以在5.1.

此更改记录在GCC 5 发行系列发行说明中

默认情况下启用 std::string 的新实现,使用小字符串优化而不是写时复制引用计数。

我们可以从 [libstdc++ 邮件列表:新的 std::string 实现 ( https://gcc.gnu.org/ml/gcc-patches/2014-11/msg01785. html ):

这是 std::string 期待已久的 ABI 中断,将我们古老的 Copy-On-Write 实现替换为符合 C++11 的 Small-String-Optimization 实现(基于 Paolo 的 vstring)。

它的要点是添加第二个完整的 std::string 实现,该实现用 abi_tag("cxx11") 标记,因此它的处理方式不同(正如 std::list 和 std::ios_base::failure 所做的那样)。

于 2018-07-10T01:53:45.500 回答