В стандартной библиотеке C++ ios
гарантируется, что &stream.iword(ind) != &stream.pword(ind)
при вызове на том же stream
с тем же значением ind
?С учетом того же индекса, iword() и pword() гарантированно относятся к отдельным базовым значениям?
Кроме того, гарантировано, что я могу использовать значения void*
и long
индивидуально с учетом того же индекса (т. Е. Они не реализованы как объединение и т. Д.)?
Я полагаю, что проблема X-Y здесь в том, как я знаю, было ли инициализировано мое заданное значение («выделено» с использованием xalloc()
), если задан случайный поток? Я спрашиваю, потому что я видел, как люди использовали pword()
, чтобы проверить магическую константу, а затем iword()
, чтобы инициализировать это значение, если предыдущее условие выходит из строя.
В основном я забочусь о C++ 11 и далее, хотя любая соответствующая историческая информация приветствуется.
Ссылка, возвращаемая 'iword()', недействительна при вызове 'pword()', поэтому я не уверен, что адреса могут быть осмысленно сопоставлены. – Cornstalks
@Cornstalks Интересно; как это признано недействительным?Вы имеете в виду, что вы можете использовать 'pword()' или 'iword()', но не оба? – Qix
Вот некоторая (не авторитетная, но очень полезная) документация по ['iword'] (http://en.cppreference.com/w/cpp/io/ios_base/iword) и [' pword'] (http://en.cppreference.com/w/cpp/io/ios_base/pword). Для обоих этих методов обратите внимание на предложение * «Ссылка может быть аннулирована любой операцией на этом объекте« ios_base »[...]» *. Вы можете использовать один из них, но как только вы вызываете следующую функцию, вам нужно отменить свою прежнюю ссылку и больше не использовать ее. Подумайте о том, как это сделать адрес объекта в 'std :: vector'. Это нормально, но как только вы назовете 'push_back', этот адрес может быть недействительным. – Cornstalks