大规模编辑:
按照juanchopanza的建议,我设法得到了这个最小的例子:
#include <memory>
struct a{
int b;
};
int main()
{
typedef std::auto_ptr<a> ArgAutoPtr;
ArgAutoPtr floatingArg;
floatingArg = ArgAutoPtr( new a );
}
这给了我错误:
no match for 'operator=' in 'm_floatingArg = std::auto_ptr<a>(((a*)operator new(4u)))'
QNX 6.4.1与GCC 4.3.3
修改
我设法像这样编译它。这是否按预期工作或将产生......无论邪恶auto_ptr
生成什么?
ArgAutoPtr floatingArg2 = ArgAutoPtr( new a );
floatingArg = floatingArg2;
答案 0 :(得分:6)
表达式ArgAutoPtr( new a )
正在创建一个临时auto_ptr
。
auto_ptr::operator=
的其他所有示例不同, operator=
对其参数采用非const 引用。非const引用不能绑定到临时引用。
答案 1 :(得分:2)
如果您已经拥有auto_ptr<T>
类型的变量,则可以更轻松地将新指针直接提供给其reset
方法。例如,您的案例将成为:
std::auto_ptr<a> myptr;
// : : :
myptr.reset(new a);
如果你正在构建一个新的auto_ptr<T>
,你可以直接调用它的构造函数来清楚你正在做什么:
std::auto_ptr<a> myptr2(new a);
(作为后期编辑废弃的附注,命名带有前缀m_
的本地可能会误导该代码的大多数读者。)