用clang编译失败,libstdc ++ 4.4.7和-std = c ++ 0x

时间:2013-02-27 18:54:20

标签: c++ c++11 clang libstdc++

我正在尝试使用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); }

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

1 个答案:

答案 0 :(得分: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不会删除它们。