将原始指针分配给auto_ptr

时间:2012-11-28 06:02:12

标签: c++ smart-pointers auto-ptr

关于有效使用auto_ptr,我正在阅读an article。在那里,建议使用以下代码作为正确的代码:

// Example 10(c): Correct (finally!)
//
auto_ptr<String> f()
{
  auto_ptr<String> result = new String;
  *result = "some value";
  cout << "some output";
  return result;  // rely on transfer of ownership;
                  // this can't throw
}

但据我所知,auto_ptr的赋值运算符只接受另一个auto_ptr作为rhs - 以避免意外误用。那么,下面的一行是文章中的拼写错误,还是真的能够起作用呢?

auto_ptr<String> result = new String;

1 个答案:

答案 0 :(得分:5)

这条线确实不正确,但不是出于你想的原因。它不调用赋值运算符,而是调用构造函数。当您在第一次声明对象时说=时,它不会创建对象,然后调用赋值运算符。相反,它只是调用构造函数并将其作为参数传递。所以从这个观点来看,它是“正确的”,因为它使用的是构造函数,而不是赋值运算符

或者至少如果可以的话。你会注意到std::auto_ptr的构造函数需要一个指针。但是,它标记为explicit,这意味着不允许使用上述“快捷方式”。您必须显式调用构造函数(带括号),并且不能使用=作为快捷方式来执行此操作。这就是为什么它不正确。相反,如果他们说auto_ptr<String> result(new String);,一切都会好的。此外,如果构造函数未标记为explicit,则一切都会好的。但事实并非如此。