const int i0 = 5;
//int i1 = const_cast<int>(i0); // compilation error
int i2 = (int)i0; // okay
int i3 = 5;
//const int i4 = const_cast<const int>(i3); // compilation error
const int i5 = (const int)i3; // okay
Ошибки компиляции вызваны тем, что вы не отбрасываете const/не добавляете const. Вместо этого вы копируете i0. Для этой операции вообще не требуется приведение:
int i1 = i0;
const int i4 = i3;
Тип, к которому вы приводите, должен быть указателем или ссылкой. В противном случае использование const_cast не имеет смысла, поскольку вы можете напрямую скопировать его. Для указателей, например, вы можете отказаться от const, потому что разыменование указателя даст другой тип для const T*
(выдает const T
), чем для T*
(выдает T
). Для ссылок то же самое: T&
будет обращаться к объекту, используя другой тип указателя this, чем const T&
. Теперь то, что вы действительно хотели заархивировать:
const int i0 = 5;
//int & i1 = const_cast<int&>(i0); // okay (but dangerous)
int & i2 = (int&)i0; // okay (but dangerous)
int i3 = 5;
//const int&i4 = const_cast<const int&>(i3); // ok now and valid!
const int&i5 = (const int&)i3; // okay too!
Вышеупомянутое может привести к неопределенному поведению, когда вы пишете в изначально константный объект через ссылку на неконстантный (на самом деле, простое приведение и чтение не является неопределенным поведением само по себе. Но если вы отбрасываете константу, вы можете также напишите в него, что затем приводит к неопределенному поведению)
person
Johannes Schaub - litb
schedule
16.12.2008
int', which is not a pointer, reference, nor a pointer-to-data-member type invalid use of const_cast with type
const int', который не является указателем, ссылкой или типом указателя на член данных - person   schedule 17.12.2008