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