Ответ 1
В С++ 11, [basic.lval] p10 говорит,
Если программа пытается получить доступ к сохраненному значению объекта через значение gl другого, чем одно из следующих типов, поведение undefined:
- ...
- a char или неподписанный char тип.
(точное расположение может отличаться в других версиях С++, но смысл одинаков.)
Это означает, что вы можете взять vector<unsigned char> cache
и получить доступ к его содержимому с помощью диапазона [reinterpret_cast<char*>(cache.data()), reinterpret_cast<char*>(cache.data()) + cache.size())
. (@Kerrek SB упомянул об этом.)
Если вы сохраняете vector<unsigned char>
в Processor
, чтобы соответствовать типу возврата LoadFile
, а _dataOperation()
фактически принимает массив char
(что означает const char*
и размер), вы можете когда вы передаете аргумент _dataOperation()
Однако, если _dataOperation()
принимает vector<char>
специально, и вы сохраняете vector<unsigned char> cache
, то вы не можете передать его reinterpret_cast<vector<char>&>(cache)
. (т.е. @André Puel совершенно не прав. Не слушайте его.) Это нарушает правила псевдонимов, и компилятор попытается разозлить ваших клиентов в 2 часа ночи. (И если эта версия вашего компилятора не справится с этим, следующая версия будет продолжать пытаться.)
Один из вариантов, как вы упомянули, имеет шаблон LoadFile()
и возвращает (или заполняет) вектор нужного вам типа. Другим является копирование результата, для которого краткая версия снова является reinterpret_cast
исходного вектора .data()
. [basic.fundamental] p1 упоминает, что "для типов символов все биты представления объекта участвуют в представлении значений". Это означает, что вы не потеряете данные с помощью этого reinterpret_cast
. Я не вижу твердой гарантии, что никакая битовая диаграмма unsigned char
может вызвать ловушку, если reinterpret_cast'ed
- char
, но я не знаю ни о каком современном оборудовании или компиляторах, которые это делают.