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)
这条线确实不正确,但不是出于你想的原因.它不调用赋值运算符,而是调用构造函数.当您说=第一次声明对象时,它不会创建对象,然后调用赋值运算符.相反,它只是调用构造函数并将其作为参数传递.所以从这个观点来看,它是"正确的",因为它使用的是构造函数,而不是赋值运算符
或者至少如果可以的话.你会注意到std::auto_ptr构造函数需要一个指针.但是,它已被标记explicit,这意味着不允许使用上述"快捷方式".您必须显式调用构造函数(带括号),并且不能=用作快捷方式来执行此操作.这就是为什么它是不正确的.相反,如果他们说auto_ptr<String> result(new String);,一切都会好的.此外,如果没有标记构造函数explicit,一切都会没问题.但事实并非如此.