я читал статья об эффективном использовании 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;
Эта строка действительно неверна, но не по тем причинам, о которых вы думаете. Он не вызывает оператор присваивания, а вызывает конструктор. Когда ты сказал =
когда вы впервые объявляете объект, он не создает объект, а затем вызывает оператор присваивания. Скорее, он просто вызывает конструктор и передает его в качестве аргумента. Так что с этой точки зрения, это «правильно», потому что он использует конструктор, а не оператор присваивания
Или, по крайней мере, если бы это было возможно. Вы заметите std::auto_ptr
конструктор принимает указатель. Тем не менее, это отмечено explicit
Это означает, что указанный выше ярлык не разрешен. Вы должны явно вызвать конструктор (с круглыми скобками) и не можете использовать =
как ярлык для этого. Вот почему это неправильно. Если вместо этого они сказали auto_ptr<String> result(new String);
, все будет хорошо. Кроме того, если конструктор не был отмечен explicit
, все будет хорошо. Но как это, это не правильно.
Других решений пока нет …