2016-11-27 15 views
1

я хотел бы знать, если есть свой род неявного преобразования между переменным при использовании указателя на целую константу, , например, если я использовать адрес переменного типа INT или сопзЬ Int он принимает, чтобы сохранить его, однако, если я использовать обычный указатель на Int это не позволяет хранить адреса сопзЬ Int типа, почему это ?, заранее спасибоConst INT неявного преобразование C++

int i=4; 
const int ii=4; 

//pointer to constant int 
const int *pci=&i; //OK. 
pci=ⅈ //OK. 
int *pi=ⅈ //ERROR invalid conversion. 
+3

Вы просите 'C++ 'или' c'? Разные языки; Различные стандарты; Различное значение для 'const'. – StoryTeller

+3

'int *' может неявно преобразовывать 'const int *', наоборот нет. В C++. – songyuanyao

+0

для C++, спасибо –

ответ

1

Первое и второе задание инициализируют pci до . Const указывают на int или const int.

Так что вы можете иметь один из двух ситуаций:

  • const int*, который указывает на int.

    pci=&i; 
    
  • const int*, который указывает на const int.

    pci=ⅈ 
    

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

Поступая:

int *pi=ⅈ 

Вы делаете int* точку к const int, который означает, что вы удалить ограничение.

Поскольку удаление ограничения может быть рискованным, для этого вам необходимо использовать const_cast.

int* pi = const_cast<int*>(&ii); 

Обратите внимание, что принудительное удаление модификатора constyou should ask yourself twice if you really wanna do что-то, так как это также делает модификатор const несколько бессмысленно, потому что вы будете в состоянии изменить что «постоянного» адреса через преобразованные переменный.

+0

Не '' и ii' вывести указатель 'int * const'? –

+0

@ πάνταῥεῖ 'ii' является' const int' .. так ... – StoryTeller

+1

@StoryTeller Я все еще смущен этим, после всех этих десятилетий. Это может быть причиной, по которой я избегаю указателей, таких как ад в C++. –

1

Просто назначая указатель на const элемента указателя на не- const элемента не допускается, так как это было бы тихо уволить const -ness оригинала, который является то, что вы не хотите, и может также является источником молчащих ошибок, что является одной из причин, по которым это запрещено.

Однако, если это действительно то, что вы хотите, вы можете явно запросить, чтобы удалить const классификатор с помощью const_cast