неявное преобразование из константного массива символов в массив символов - PullRequest
0 голосов
/ 03 июля 2018

в приведенном ниже фрагменте кода, когда я передаю литеральную строку функции, она выдает мне предупреждение ISO C++ forbids converting a string constant to 'char*, но когда я назначаю символьный массив этому литералу, предупреждение исчезает. Я знаю, что тип строковых литералов в C ++ является константным символьным массивом, но тип переменной ch является просто char. (Не constant char)

#include <iostream>

using namespace std;

void func(char s[])
{
    cout << s;
}
int main() {
    char ch[] = "what";
    func(ch);
    func("what"); //gives warning
    return 0;
}

и у меня есть еще один вопрос. когда я добавляю const к типу входного параметра функции func, в этой ситуации также нет предупреждения, даже если я передаю массив символов в функцию, а не в массив константных символов. Я думал, что это должно вызвать предупреждение для вызова fucn(ch) потому что ch это массив символов, а не константный массив символов.

#include <iostream>

using namespace std;

void func(const char s[])
{
    cout << s;
}
int main() {
    char ch[] = "what";
    func(ch);
    func("what");
    return 0;
}

1 Ответ

0 голосов
/ 03 июля 2018

const не о точном соответствии, а о том, что функция делает с параметром.

Если вы определяете функцию с параметром const, функция обещает не изменять переданную переменную. Следовательно, вы можете вызывать его с помощью константных строк, а также (изменяемых) непостоянных переменных. Компилятор предупредит вас, если вы попытаетесь изменить значение внутри функции (потому что вы обещали, что не будете).

Если вы определяете функцию с непостоянным параметром, она может изменить параметр. Поэтому компилятор предупреждает вас, если вы передадите постоянную строку, так как это приведет к неопределенному поведению / сбоям.

...