【问题标题】:Assigning raw pointers to auto_ptr将原始指针分配给 auto_ptr
【发布时间】:2012-11-28 06:02:12
【问题描述】:

我正在阅读an article 关于有效使用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
}

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

auto_ptr<String> result = new String;

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 但是关于您对治疗师(现已删除)答案的评论:这当然涉及复制构造函数。关于问题中所述的初始化不起作用的原因,您的回答是正确的。但同样正确的是,这是复制初始化,它涉及到复制构造函数。 (对复制构造函数的实际调用可能会被优化掉,但那是另一回事。)
    • @jogojapan:嗯,每天都学点新东西。有没有什么地方我可以阅读更多(比标准更少的法律术语)关于构造函数被调用的确切时间,这将解释更多(在编译器优化它们之前)?
    • 我真的不知道...有一些不错的 SO 帖子,例如这个stackoverflow.com/questions/1051379/…。我从中学到的最多的是:stackoverflow.com/questions/12372442/…,虽然那个读起来很糟糕,只有当你并行阅读标准时才能理解。
    猜你喜欢
    • 2023-01-26
    • 2013-12-10
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2019-08-28
    • 2017-02-02
    • 1970-01-01
    • 2014-08-23
    相关资源
    最近更新 更多