В стандарте C ++ ios
библиотека, это гарантировано, что &stream.iword(ind) != &stream.pword(ind)
когда вызывается на тот же stream
с тем же ind
значение?
Кроме того, это гарантировано, что я могу использовать void*
а также long
значения по отдельности имеют одинаковый индекс (т. е. они не реализованы как объединение и т. д.)?
Я полагаю, что проблема X-Y заключается в том, как мне узнать, является ли мое произвольное значение, заданное случайным потоком xalloc()
) был инициализирован? Я спрашиваю, потому что я видел, как люди используют pword()
проверить магическую константу, а затем iword()
инициализировать это значение, если предыдущее условие не выполняется.
Я в основном беспокоюсь о C ++ 11 и более поздних версиях, хотя любая актуальная историческая информация приветствуется.
Стандарт 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
(и наоборот).
Других решений пока нет …