Значит, я вас неправильно понял. Но потому и reinterpret_cast, что так просто не преобразуешь. И потому и вопрос, что сделано всё «методом выкручивания рук», простая логика говорит, что всё верно, а вот что скажет об этом стандарт?
P.S. Я получил именно то, что хотел — при смене типа элемента на const размер и указатель автоматически становятся константными. И оно работает на двух компиляторах, Embarcadero и MinGW64. Просто был вопрос…
Это я понимаю. Просто вы написали { const size_t _size; const int* const _ptr; }, и поэтому я спросил, эквивалентно ли оно const { size_t _size; const int* _ptr; }.
Но Buf1d, как вы видите, вообще не владеет никакой памятью. И не важно, что этот буфер оборачивает, std::vector или const double*, взятый невесть откуда. Я просил ответ на конкретный вопрос: при каких условиях такой reinterpret_cast безопасен и что об этом говорит стандарт C++.
Архитектура x86 (32-битная). Конкретно процессор — AMD Phenom x4. Выравнивание стандартное — скажем, 4 байта. Считаем, что функция «вычислить» реентарабельна (по крайней мере, так должно быть в идеале — она ничего не пишет, только делает что-то из r/o входных данных). Двойная блокировка тут непригодна, надежда только на атомарность, и мой вопрос как раз в этом: а насколько атомарны операции «записать double» и «считать double»?
А с кодом чуть-чуть ошибся, но вроде нефатально:
double &x = кэш[i];
if (isnan(x)) x=вычислить(i);
return x;
Итак, автоповтором занимается КЛАВИАТУРА (по крайней мере AT- или PS/2-, про USB- не скажу). Так что реалистично — никак. Разве что вычитать задержки клавиатуры из системы и повторить их самостоятельно.