从常量字符数组到字符数组的隐式转换

时间:2018-07-03 02:53:11

标签: c++ arrays constants literals

在下面的代码片段代码中,当我向函数传递文字字符串时,它会向我发出警告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函数的输入参数类型时,即使我将字符数组传递给函数而不是const字符数组,在这种情况下也没有警告。我认为这应该引起警告之所以调用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 :(得分:0)

const与精确匹配无关,而是函数对参数的作用。

如果您使用参数const定义函数,则函数承诺不会更改传递的变量。因此,您可以使用常量字符串以及(可变)非常量变量来调用它。如果您尝试修改函数中的值(因为您答应了,则不会),编译器会警告您。

如果您使用非恒定参数定义函数,则它可以更改参数。因此,如果您传递常量字符串,编译器会警告您,因为这将导致未定义的行为/崩溃。