Это нормально (= четко определенное поведение в соответствии со стандартом) для вызова:
mystream.read(buffer, 0);
или же
mystream.write(buffer, 0);
(и, конечно, ничего не будет прочитано или написано).
Я хотел бы знать, должен ли я проверить, является ли предоставленный размер нулевым, перед вызовом одной из этих двух функций.
Да, поведение четко определено: обе функции пройдут через движения для неформатированных функций ввода / вывода (построение часового механизма, установка битов сбоя, если установлен eofbit, очистка связанного потока, если необходимо), и затем они попадут в это предложение :
§27.7.2.3 [istream.unformatted] / 30
Символы извлекаются и сохраняются до тех пор, пока не произойдет одно из следующих действий:
— сохранено n символов;
§27.7.3.7 [ostream.unformatted] / 5
Символы вставляются, пока не произойдет одно из следующих действий
— вставлено n символов;
«Ноль символов хранится / вставляется» — это истина, прежде чем что-либо будет сохранено или извлечено.
Глядя на реальные реализации, я вижу for (; gcount < n; ++gcount)
в libc ++ или же sgetn(buffer, n);
в stdlibc ++ который имеет эквивалентный цикл
Еще одно извлечение из 27.7.2.3 Unformatted input functions/1
дает нам подсказку, что входные буферы нулевого размера являются допустимым регистром:
неотформатированные функции ввода, принимающие массив символов ненулевой размер в качестве аргумента также следует хранить нулевой символ (используя charT ()) в первом месте массива.