Например,
int const x = 3;
действительный код?
Если так, делает это означает то же как
const int x = 3;
?
Они оба являются действительным кодом и оба эквивалентны. Для типа указателя они оба являются допустимым кодом, но не эквивалентны.
Объявляет 2 типа int, которые являются постоянными:
int const x1 = 3;
const int x2 = 3;
Объявляет указатель, данные которого нельзя изменить с помощью указателя:
const int *p = &someInt;
Объявляет указатель, который нельзя изменить, чтобы указать на что-то еще:
int * const p = &someInt;
Да, они такие же. По сути, правило C ++ заключается в том, что const
применяется к типу слева от него. Однако есть исключение: если вы поместите его в крайний левый угол объявления, оно применяется к первой части типа.
Например, в int const *
у вас есть указатель на постоянное целое число. В int * const
у вас есть постоянный указатель на целое число. Вы можете экстраполировать это на указатель на указатели, и английский может запутать, но принцип тот же.
Для другого обсуждения достоинств одного над другим см. мой вопрос по этому поводу. Если вам интересно, почему большинство людей используют исключение, эта запись в FAQ Страуструпа может быть полезна.
Да, это абсолютно то же самое. Однако есть разница в указателях. Я имею в виду:
int a;
// these two are the same: pointed value mustn't be changed
// i.e. pointer to const value
const int * p1 = &a;
int const * p2 = &a;
// something else -- pointed value may be modified, but pointer cannot point
// anywhere else i.e. const pointer to value
int * const p3 = &a;
// ...and combination of the two above
// i.e. const pointer to const value
const int * const p4 = &a;
Это одно и то же по смыслу и действительности.
Насколько я знаю, const становится сложной только тогда, когда в ней задействован указатель.
int const * x;
int * const x;
разные.
int const * x;
const int * x;
одинаковые.