我正在尝试使用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
时,它可以正常工作。听起来补丁可能没有修复所有问题,这是一个已知的问题,是否有一个已知的修复?
答案 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不会删除它们。