Назначение необработанных указателей для 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
}

Но, насколько мне известно, оператор присваивания auto_ptr только принимает другого auto_ptr как rhs — чтобы избежать случайного неправильного использования. Итак, является ли следующая строка опечаткой в ​​статье, или она действительно должна работать?

auto_ptr<String> result = new String;

1

Решение

Эта строка действительно неверна, но не по тем причинам, о которых вы думаете. Он не вызывает оператор присваивания, а вызывает конструктор. Когда ты сказал = когда вы впервые объявляете объект, он не создает объект, а затем вызывает оператор присваивания. Скорее, он просто вызывает конструктор и передает его в качестве аргумента. Так что с этой точки зрения, это «правильно», потому что он использует конструктор, а не оператор присваивания

Или, по крайней мере, если бы это было возможно. Вы заметите std::auto_ptrконструктор принимает указатель. Тем не менее, это отмечено explicitЭто означает, что указанный выше ярлык не разрешен. Вы должны явно вызвать конструктор (с круглыми скобками) и не можете использовать = как ярлык для этого. Вот почему это неправильно. Если вместо этого они сказали auto_ptr<String> result(new String);, все будет хорошо. Кроме того, если конструктор не был отмечен explicit, все будет хорошо. Но как это, это не правильно.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]