Учитывая один и тот же индекс, гарантированно ли iword () и pword () ссылаются на отдельные базовые значения?

В стандарте C ++ ios библиотека, это гарантировано, что &stream.iword(ind) != &stream.pword(ind) когда вызывается на тот же stream с тем же ind значение?

Кроме того, это гарантировано, что я могу использовать void* а также long значения по отдельности имеют одинаковый индекс (т. е. они не реализованы как объединение и т. д.)?

Я полагаю, что проблема X-Y заключается в том, как мне узнать, является ли мое произвольное значение, заданное случайным потоком xalloc()) был инициализирован? Я спрашиваю, потому что я видел, как люди используют pword() проверить магическую константу, а затем iword() инициализировать это значение, если предыдущее условие не выполняется.

Я в основном беспокоюсь о C ++ 11 и более поздних версиях, хотя любая актуальная историческая информация приветствуется.

1

Решение

Стандарт C ++ говорит, что iword() а также pword() должен вести себя так, как будто они манипулируют двумя отдельными независимыми блоками хранения, а не, скажем, одним блоком, содержимое которого интерпретируется как long иногда и void* в других случаях.

[Ios.base]

namespace std {
class ios_base {
// ...
private:
long* iarray; // exposition only
void** parray; // exposition only
};
}

[Ios.base.storage] / 3

  long& iword(int idx);

Последствия: Если iarray нулевой указатель, выделяет массив long неопределенного размера и хранит указатель на свой первый элемент в iarray, Затем функция расширяет массив, на который указывает iarray при необходимости включить элемент iarray[idx], Каждый вновь выделенный элемент массива инициализируется нулем. Возвращенная ссылка недействительна после любых других операций над объектом. Однако значение упомянутой памяти сохраняется, так что до следующего вызова copyfmtзвонит iword с тем же индексом дает другую ссылку на то же значение …

[Ios.base.storage] / 5 повторяет ту же самую формулировку, подставляя pword за iword, parray за iarray а также void* за long,

Важной частью является «стоимость хранилища … сохраняется» — последующее iword вызов с данным индексом должен увидеть значение, которое было записано в хранилище, которое предыдущий iword вызов с тем же индексом предоставил ссылку, независимо от промежуточных вызовов методов (кроме copyfmt), даже если этот промежуточный вызов метода pword (и наоборот).

1

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

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

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