【问题标题】:Compiling with clang fails with libstdc++4.4.7 and -std=c++0x使用 clang 编译失败并出现 libstdc++4.4.7 和 -std=c++0x
【发布时间】:2013-02-13 17:27:08
【问题描述】:

我正在尝试使用 clang 在使用 libstdc++4.4.7 的旧 RHEL5 机器上编译一些代码。当我启用 -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 site 上应用patch(修复了其他错误但没有修复这个错误)之后。当我禁用-std=c++0x 时,它工作正常。听起来补丁可能没有解决所有问题,这是一个已知问题,是否有已知修复?

【问题讨论】:

  • @Zoidberg,谢谢,修正了错误

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


【解决方案1】:

补丁不完整。

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

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

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

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

【讨论】:

  • 所以,如果我错了,请纠正我,但这应该意味着每个使用 Clang 的 libstdc++4.4 用户都有同样的问题。如果这些行解决了问题,维护 Clang 的人可以很容易地修改补丁。
  • 是的,我希望使用该组合的每个人都会遇到同样的问题。我认为 4.4 标头中的 shared_ptr 也存在同样的问题,可能还有其他类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
相关资源
最近更新 更多