2

我正在尝试使用 clang 在旧 RHEL5 机器上编译一些代码,该机器使用libstdc++4.4.7. 当我启用-std=c++0x标志时,我得到:

/usr/lib/gcc/i386-redhat-linux6E/4.4.7/../../../../include/c++/4.4.7/bits/vector.tcc:380:19: error: call to implicitly-deleted copy constructor of
  'value_type' (aka 'std::pair<double, double>')
          value_type __x_copy = __x;
                     ^          ~~~
/usr/lib/gcc/i386-redhat-linux6E/4.4.7/../../../../include/c++/4.4.7/bits/stl_vector.h:851:9: note: in instantiation of member function
  'std::vector<std::pair<double, double>, std::allocator<std::pair<double, double> > >::_M_fill_insert' requested here
  { _M_fill_insert(__position, __n, __x); }

这是在我在clang 网站上应用补丁(修复了其他错误但没有修复这个错误)之后。当我禁用它时,它工作正常。听起来补丁可能没有解决所有问题,这是一个已知问题吗?是否有已知修复?-std=c++0x

4

1 回答 1

2

补丁不完整。

Clang 是正确的,代码错误:复制构造函数应该被删除,因为std::pair声明了一个移动构造函数,但那是因为 clang 正在实现最终的 C++11 规则,并且 GCC 4.4 头文件被编写为与 C 的早期版本一起使用++0x 草案,由 GCC 4.4 支持

您应该可以通过将其添加到以下内容来修复它std::pair

pair(const pair&) = default;
pair& operator=(const pair&) = default;

这将恢复隐式定义的复制操作,因此 Clang 不会删除它们。

于 2013-02-28T18:20:48.823 回答