【发布时间】: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