1

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

// 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
}

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

auto_ptr<String> result = new String;
4

1 回答 1

5

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

或者至少如果可以的话。您会注意到std::auto_ptr的构造函数带有一个指针。但是,它被标记为explicit,这意味着上面的“快捷方式”是不允许的。您必须显式调用构造函数(带括号),并且不能=用作这样做的快捷方式。这就是它不正确的原因。相反,如果他们说auto_ptr<String> result(new String);,一切都会好起来的。另外,如果没有标记构造函数explicit,一切都会好起来的。但事实上,它是不正确的。

于 2012-11-28T06:09:56.607 回答