Я использовал схему клавиатуры Emacs в течение нескольких дней, но она быстро свела меня с ума - я не мог снова переплести ключи они способ, к которому я привык в Emacs (или не мог найти, как снова переплести быстро).
я должен попробовать XKeyMacs....
Попробую проще выразить то, что говорят другие:
Функция someFunction
принимает строку только для чтения (хотя для простоты ] char *
может использоваться во многих других случаях). Независимо от того, передаете ли вы строку только для чтения в someFunction
или нет, параметр обрабатывается как доступный только для чтения кодом, выполняющимся в контексте этой функции. Таким образом, внутри этой функции компилятор попытается предотвратить запись в эту строку в максимально возможной степени. Неконстантный указатель - это такая попытка игнорировать тег только для чтения для строки и компилятора, справедливо и громко информирует вас о таком игнорировании системы типов;)
В чем разница между: int someFunction (const char * sm) const {...} и это: int someFunction (const char * sm) {... }
Первая - это функция, которая принимает параметр только для чтения. Вторая const
, записанная после закрывающих скобок, действительна только для функций-членов. Он не только принимает параметр только для чтения, но также гарантирует, что состояние объекта не изменится. Обычно это называется константой проектного уровня
Это не совсем ясно из вашего вопроса, и я подозреваю, что текст ошибки, который вы даете, на самом деле неверен и фактически гласит:
не может преобразовать из
const char *
вchar *
Поскольку вы говорите, что
someMemberVar - это просто указатель на char.
Это имеет смысл. Имейте в виду, что const char *
на самом деле то же самое, что char const *
- то есть это указатель на const char, а не константный указатель на char! И вы не можете преобразовать указатель на T const
в указатель на T
, потому что это нарушает безопасность типов. Рассмотрим:
const char* a = "abc";
char* b = a; // what you're trying to do
b[0] = 'x'; // if you could do it, you could change const data without casts
Если вы передадите неконстантный указатель в someFunction
, он автоматически преобразуется в константный указатель. Так что вы можете' t присвоить sm
someMemberVar
, потому что это нарушит постоянство sm. Вы можете объявить someMemberVar
как const char *
, и ваш код будет работать, однако вы не сможете изменить то, на что он указывает.
const char *
- указатель на постоянный char:
const char* ptr0; // ptr0 is mutable, *ptr0 is const
char* const ptr1; // ptr1 is const, *ptr1 is mutable
В комментарии к одному из других ответов вы сказали:
const char * sm означает, что я могу передать const или неконстантный, так почему C ++ конвертирует его автоматически? Который для меня не имеет смысла.
Между вашим первоначальным вопросом и этим комментарием, я думаю, вы неправильно понимаете, как компилятор обрабатывает типы.
Вы правы, что неконстантный char *
можно безопасно преобразовать в const char *
. Однако ваш метод явно принимает const char *
. Таким образом, хотя вы можете передать в функцию char *
, компилятор просто автоматически приводит аргумент при вызове функции. Фактический код функции не знает, был ли исходный аргумент константой или нет. Компилятор должен использовать фактическое объявление переменной, которую вы используете, , а не какой-то предыдущей переменной, которая имела такое же значение.
const char * sm - указатель на постоянный символ (или массив). Когда вы пытаетесь назначить someMemberVar указатель на char, вы пытаетесь указать ему на набор константных символов. Это причина ошибки.
В вашем примере sm - это const char *, поэтому someFunction имеет договор со своим вызывающим абонентом, что он не будет изменять память, на которую указывает sm.
Но если вы назначите sm для someMemberVar и someMemberVar не является const char *, тогда вы сможете изменить память, на которую указывает sm, через someMemberVar, а компилятор не позволит вам это сделать.