2014-01-02 2 views
0

Я довольно новичок в C++, и я смущаюсь при попытке прочитать такие прототипы.Почему const MyClass const * недействителен?

Этот прототип "строит" в Visual Studio 2012 (в статической библиотеке Native C++, а не C++/CLI), хотя это не делает константу указателя. Я заметил, что это выдает предупреждение, которое я не видел сначала.

C++ Visual Studio 2012

 int intTest =3; 
    int intTest2 = 5; 
    const int const* pointerTest = &intTest; 
    pointerTest = &intTest2; //This works 

    const int* const pointerTest2 = &intTest; 
    pointerTest2 = &intTest2; //This doesn't build because the pointer is constant. 

я понял, моя ошибка, потому что, когда я пытался построить этот код в Linux (Затмения с GCC 4.6.3) он выдает ошибку:

Я написал это вместо const MyClass * const по ошибке, но я этого не заметил, потому что Visual Studio не выбрасывала ошибка.

Почему этот синтаксис не так? Я не писал это специально, но я хотел бы понять.

+2

http://kuhllib.com/2012/01/17/continental-const-placement/ – BoBTFish

ответ

2

const украшает термин к его слева, если только он не самый левый, то он украшает этот термин справа.

Перепишите ваше заявление с помощью вышеуказанного правила

int const const* pointerTest = &intTest; 

Вы должны написать:

const int * const pointerTest = &intTest; 

Или придерживаться правой сопзЬ стиля и не будет озадачен:

int const * const * const * const someEvilVariable = foo(); 
+0

Итак, из «int const const * pointerTest = & intTest;» это означает, что я написал: «[int const const] * pointerTest = & intTest;» Указатель на «int const const»? Теперь это имеет смысл! Пожелание Visual Studio будет вызывать ошибку, например, GCC. – Dzyann

1

const MyClass * и MyClass const * оба объявляют указатель на данные const, поэтому и обе стороны MyClass выполняют одну и ту же вещь, поэтому предупреждение.

Один из способов понимания того, что было объявлено, - это прочитать декларацию справа налево, например.

MyClass const * const pointerTest = &intTest; //a const pointer to const data of type MyClass 

Однако, вы можете установить любую сторону квалификатора сразу рядом с именем класса, например, так:

const MyClass * const pointerTest = &intTest; //a const pointer to data that is const. 

Других возможных декларации:

const MyClass * pointerTest = &intTest; //a non-const pointer to const data. 
MyClass * const pointerTest = &intTest; //a const pointer to non-const data. 
2

В настоящем сообщении

const int const* pointerTest = &intTest; 

квалификатор const был просто дублирован.Это эквивалентно

const int * pointerTest = &intTest; 

или

int const* pointerTest = &intTest; 

Здесь указатель года постоянные данные определяются. Указатель сам по себе не является константой.

В этом заявлении

const int* const pointerTest2 = &intTest; 

вы определили указатель себя как константа. Он может быть инициализирован только тогда, когда он определен и не может быть изменен.

1

Не имеет значения, находится ли const до или после type (int).

Поэтому

const int const* pointerTest 

переводит в

const int* pointerTest 

с момента ввода const дважды ничего не делать.

Что такое материя есть порядок const и *, поэтому вы так:

-Первый является pointer к const int:

const int const* pointerTest = &intTest; 

-и второй является const pointer к const int: (так как const приходит после *)

const int* const pointerTest2 = &intTest; 

поэтому вы не можете изменить указатель и получить сообщение об ошибке.

Смежные вопросы