将原始指针分配给auto_ptr

Mey*_*sam 1 c++ smart-pointers auto-ptr

我正在阅读一篇关于有效使用的文章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
}
Run Code Online (Sandbox Code Playgroud)

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

auto_ptr<String> result = new String;
Run Code Online (Sandbox Code Playgroud)

Cor*_*lks 5

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

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