Это связано с const-правильностью .const char *text
означает, что text
- указатель на константу char
.Это означает, что если вы попытаетесь сделать что-то вроде
*text = 'a'
, компилятор выдаст ошибку, так как вы пытаетесь изменить объект const
.Если бы вы могли сделать
char *temp;
temp = text;
, тогда вы могли бы сделать
*temp = 'a'
, и не было бы ошибки, даже если вы только что изменили объект const.Вот почему C ++ требует, чтобы вы использовали const_cast
, если вы действительно хотите отбросить const
(есть несколько вариантов использования для этого, но они далеко не то, что вы обычно хотите делать).
Опасно, внизу будут драконы.Будьте очень, очень осторожны, если вы решите использовать const_cast
Допустим, вам приходится иметь дело со старым вызовом API, который принимает только char*
, , но гарантирует, что он не изменит , тогда вы можете использовать что-то вроде
int wrap_api(const char *text)
{
return api_call(const_cast<char*>(text));
}
, и это будет "хорошо", поскольку api_call
гарантирует, что строка не будет изменена.С другой стороны, если api_call
может измениться, то это будет допустимо только в том случае, если то, на что указывает text
, на самом деле не равно, как
char foo[] = "test"
wrap_api(foo);
, то будет допустимо, если foo
будет изменено, но
const char foo* = "test"
wrap_api(foo);
будет недопустимым, если foo
будет изменен и поведение не определено.