【问题标题】:Why C++ Builder cannot compile this?为什么 C++ Builder 不能编译这个?
【发布时间】:2014-05-02 13:35:02
【问题描述】:

我正在使用此代码:

#include <iostream>
#include <memory>
#include <vector>
using namespace std;

void out(int* p){
    cout << *p;
}

int main(){
    vector<unique_ptr<int> > vInt;

    for(int i = 0; i < 10; i++)
        vInt.push_back(unique_ptr<int>(new int(i)));

    out(vInt[0].get()); // 0
    return 0;
}

如果我使用一些在线编译器,它可以编译,但 C++ Builder XE2 和 XE6 都会报告错误:

[bcc32 Error] vector(1179): E2247 'unique_ptr<int,default_delete<int> >::unique_ptr(const unique_ptr<int,default_delete<int> > &)' is not accessible
[bcc32 Error] vector(1203): E2247 'unique_ptr<int,default_delete<int> >::unique_ptr(const unique_ptr<int,default_delete<int> > &)' is not accessible
[bcc32 Error] xutility(1682): E2247 'operator unique_ptr<int,default_delete<int> >::=(const unique_ptr<int,default_delete<int> > &)' is not accessible
[bcc32 Error] xutility(1552): E2247 'operator unique_ptr<int,default_delete<int> >::=(const unique_ptr<int,default_delete<int> > &)' is not accessible
[bcc32 Error] xmemory(28): E2247 'unique_ptr<int,default_delete<int> >::unique_ptr(const unique_ptr<int,default_delete<int> > &)' is not accessible

我使用默认编译器/IDE 设置我不知道为什么会发生这种情况?

有 C++ Builder XE3 或更高版本的人可以确认这个问题吗?

【问题讨论】:

  • 听起来像是标准库中的错误或prvalues的处理?试试vInt.emplace_back() 而不是vInt.push_back()
  • 它无法识别 emplace_back 方法。刚刚在XE6上试过。由于上面的代码适用于 GNU GCC 4.7.2 版,我不明白为什么它在这里不起作用。我认为这是 C++ Builder 的问题?
  • 会的。看起来 C++ Builder 没有实现 C++11。听起来你被 std::auto_ptr 困住了。
  • C++ Builder 32 位不兼容 C++11,64 位编译器基于 Clang 3.1。如果你也不能使用 auto_ptr,那么你的安装有问题,因为 auto_ptr 在两个编译器中都可以工作。
  • @Tracer 您“可以”在标准容器中使用它,因为它可能会编译,但它是未定义的行为。具体来说,它的复制语义破坏了异常安全保证。

标签: c++ pointers c++11 vector c++builder


【解决方案1】:

正确实现 C++11 标准是编译器错误/失败。 push_back 有两个重载,一个采用 const 左值引用,另一个采用右值引用。您的代码非常好,因为在vInt.push_back(unique_ptr&lt;int&gt;(new int(i))); 中创建的unique_ptr 是一个临时的,它应该绑定到右值引用,然后移动到存储中。

我没有 C++ builder,所以我不知道什么变通方法会起作用。如果它碰巧实现了emplace_back,你可以使用它。否则,您可以改用boost::container::vectorboost.ptr_container

【讨论】:

    【解决方案2】:

    C++Builder 的 32 位编译器还不支持 C++11。它的 64 位编译器确实如此,因为它基于 Clang 3.1。如果你也不能使用 auto_ptr,那么你的安装有问题,因为 auto_ptr 在两个编译器中都可以工作。

    【讨论】:

      【解决方案3】:

      感谢@GregorBrandt,我找到了答案。 32 位应用程序仍然不支持 C++ 11。仅适用于 64 位。

      https://forums.embarcadero.com/message.jspa?messageID=596431

      http://qc.embarcadero.com/wc/qcmain.aspx?d=114889

      【讨论】:

      • 为 bcc32 添加 C++11 支持实际上是 Embarcadero QC 上投票最多的功能请求。不过我没有看到它发生,除非他们能以某种方式使用 bcc64 的前端和 bcc32 的后端。
      • 不,但他们最终确实发布了一个单独的 C++11 32 位编译器 (bcc32c),它基于 clang 而不是旧的 bcc32。
      • 请注意QualityCentral has now been shut down,因此您无法再访问qc.embarcadero.com 链接。如果您需要访问旧的 QC 数据,请查看 QCScraper
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 2010-11-24
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      相关资源
      最近更新 更多