2016-08-23 4 views
6

Рассмотрим следующий код:Является ли get() надежным, когда auto_ptr не инициализируется?

std::auto_ptr<std::string> p; 

if (p.get() == 0) { 
    ... 
} 

ли функция get() член стандартный и надежный способ для проверки того, что p не инициализирована? Будет ли он всегда возвращать 0, независимо от платформы, компилятора, флагов оптимизации компилятора и т. Д.?

+4

В этом примере 'auto_ptr' is * not *" uninitialized ". Конструктор по умолчанию инициализирует указатель нулевым указателем. –

ответ

1

Метод auto_ptrget не имеет предпосылки.

Это означает, что это всегда безопасно вызвать этот метод, независимо от того, в каком состоянии auto_ptr объект находится.

Contrast это с помощью функции operator* члена, который действительно есть предусловие get() != 0. Стандарт C++ определяет предпосылки для функций-членов в . Требуется статья. Если для функции нет такого предложения, всегда можно позвонить.

11

Там нет такого понятия, как ип неинициализированного std::auto_ptr, то default constructor инициализирует указатель на 0:

explicit auto_ptr(X* p = 0); 

Таким образом get() эффективно возвращает «0» по умолчанию строится std::auto_ptr.

3

Линия

std::auto_ptr<std::string> p; 

звонки the constructor

explicit auto_ptr (X* p=0) throw(); 

, который инициализирует внутренний указатель на 0.

Это зависит, следовательно, то, что вы имеете в виду под "не инициализирован". Вызов CTOR по умолчанию, как вы показали, даст get, который возвращает 0. Также инициализацию к чему-то другому, а затем с помощью вызова reset(0), даст get, который возвращает 0.

+0

При работе с несколькими платформами я могу полагаться на конструктор по умолчанию (без проверки каждой реализации) или я должен явно вызвать сброс (0), чтобы быть уверенным? – Marc

+1

Нет, нет необходимости вызывать 'reset' явно после значения по умолчанию ctor. –

Смежные вопросы