Для C++ еще есть известный пазл: константный указатель/указатель на константу. Применение слова ключевого слова const весьма вариативно:
int *const p1
int const* p2
const int* p3
Чтобы понимать, что при таких формах записи считается константой, можно воспользоваться простым правилом:
const модифицирует то, что написано прямо перед ним, за исключением (какой С++ без исключений) случая, когда это первое слово в строке. В этом случае, очевидно, модифицирует то, что прямо после.
И сразу легко понять что:
const int ** const p4
p4 - это константный указатель "* const" на указатель на константный int-тип "const int *".
Есть еще и другое мнемотическое правило для const модификатора, которое может упростить понимание. А именно:
Константно то, что слева от модификатора const.
Примеры:
Object(Object const& object); // константен обьект
Object(Object & const object); // ошибка: к ссылке не могут быть применены const/volatile модификаторы
Object(Object const* object); // константен обьект, указатель можно менять
Object(Object *const object); // обьект можно менять, указатель константен
Object(Object const *const object); // константен обьект и константен указатель