Существует ряд проблем с константно-корректными контейнерами, так как const
делает так, что они не могут ничего изменить в своих внутренних компонентах, в отличие от C++, где вы можете сделать некоторые вещи mutable
такими длинными. так как вы убедились, что функции логически const
. IIRC, есть операции, которые выполняет Array
, которые теоретически могут быть const
, но не могут быть связаны с тем, как работают некоторые из его внутренних компонентов. И меня не удивит, если из-за этого люди, которые работали над этим, ничего из этого не сделали const
, даже если некоторые из них могли бы быть.
Что касается opIndex
, то я не вижу в этой реализации ничего очевидного, что не могло бы быть const
, а то, что она вообще скомпилирована, подразумевает, что она может работать. Однако, если вы это сделаете, вам нужно перегрузить его, а не просто сделать эту конкретную перегрузку const
, иначе вы не сможете назначить ей - предположительно, на что жаловался std.algorithm. Итак, вам нужно что-то вроде
ref T opIndex(size_t i) {...}
ref const(T) opIndex(size_t i) const {...}
так что он все еще работает, чтобы назначить ему - например. arr[5] = "foo";
- пока Array
не const
. Однако, поскольку многие из операций Array
не могут быть const
из-за того, как работает его реализация, я не знаю, насколько действительно полезно делать такие функции, как opIndex
const
, потому что вы будете очень ограничены в том, что вы можете делать с const Array!T
, даже если каждая функция-член, которая может быть const
, имеет const
.
person
Jonathan M Davis
schedule
18.08.2014