C++ C++;非常量到常量转换编译错误

C++ C++;非常量到常量转换编译错误,c++,casting,const-cast,C++,Casting,Const Cast,下面的代码无法编译 void aaa(const int **a) { } int *a[] = {new int[2]}; aaa(a); 我在VS2010中遇到“无法将参数1从'int[1]'转换为'const int*”,在gcc中出现类似错误 当我将我的声明更改为: int const *a[] = {new int[2]}; 或 它可以编译,但我不明白为什么它不接受非常量变量声明函数aaa需要一个指向常量int的指针。 变量a是指向int的指针。 将后者指定给前者是错误的 int

下面的代码无法编译

void aaa(const int **a) {
}

int *a[] = {new int[2]};
aaa(a);
我在VS2010中遇到“无法将参数1从'int[1]'转换为'const int*”,在gcc中出现类似错误

当我将我的声明更改为:

int const *a[] = {new int[2]};


它可以编译,但我不明白为什么它不接受非常量变量声明

函数
aaa
需要一个指向常量int的指针。 变量
a
是指向int的指针。 将后者指定给前者是错误的

int-const*a[]
const-int*a[]
实际上是同一件事,与
aaa
的签名相匹配。如果您尝试
int*const a[]
,则将是另一种类型(指针指向指向int的常量指针),您将再次触发类型错误

如果您希望函数
aaa
获取指向int的指针的常量指针,则需要编写
aaa(int**const a)
,但参数值的常量实际上对您可以调用的内容没有影响


编辑:“但是常量不是隐式添加的吗?通过隐式强制转换完成的?(这是实际的问题)”

常量可以隐式地添加到您正在传递的值中,例如

void aaa(const int a) {}

int b=5;
aaa(b);
。。。或一级指针

void aaa(const int* a) {}

int *b=new int;
aaa(b);
。。。但不能再深入了。例如,这是无效的:

void aaa(const int** a) {}

int* b=new int;
int** c=&b;
aaa(c);

我认为James Kanze在他的回答中解释得更好。

函数
aaa
需要一个指针到指针到常量的int。 变量
a
是指向int的指针。 将后者指定给前者是错误的

int-const*a[]
const-int*a[]
实际上是同一件事,与
aaa
的签名相匹配。如果您尝试
int*const a[]
,则将是另一种类型(指针指向指向int的常量指针),您将再次触发类型错误

如果您希望函数
aaa
获取指向int的指针的常量指针,则需要编写
aaa(int**const a)
,但参数值的常量实际上对您可以调用的内容没有影响


编辑:“但是常量不是隐式添加的吗?通过隐式强制转换完成的?(这是实际的问题)”

常量可以隐式地添加到您正在传递的值中,例如

void aaa(const int a) {}

int b=5;
aaa(b);
。。。或一级指针

void aaa(const int* a) {}

int *b=new int;
aaa(b);
。。。但不能再深入了。例如,这是无效的:

void aaa(const int** a) {}

int* b=new int;
int** c=&b;
aaa(c);

我认为詹姆斯·坎泽在他的回答中解释得更好。

a的类型是
int*[]
;您需要的类型是
int const**
int*[]
转换为
int**
,但不会隐式转换为
int const**
。考虑下面的代码来理解为什么:

static int const ci = 42;

void aaa( int const** out )
{
    *out = &ci;
}

int
main()
{
    int* pa;
    aaa( &pa );     //  NOT LEGAL, because...
    *pa = 0;        //  would now change ci
    std::cout << ci << std::endl;
    return 0;
}
int**
int const*const*
的隐式转换是合法的。 (否则,您将需要一个
const\u cast
来告诉编译器
你知道你在做什么,而且这不是一个真正的问题。)

a的类型是
int*[]
;您需要的类型是
int const**
int*[]
转换为
int**
,但不会隐式转换为
int const**
。考虑下面的代码来理解为什么:

static int const ci = 42;

void aaa( int const** out )
{
    *out = &ci;
}

int
main()
{
    int* pa;
    aaa( &pa );     //  NOT LEGAL, because...
    *pa = 0;        //  would now change ci
    std::cout << ci << std::endl;
    return 0;
}
int**
int const*const*
的隐式转换是合法的。 (否则,您将需要一个
const\u cast
来告诉编译器
你知道你在做什么,并且这不是一个真正的问题。)

也许
aaa(&pa)
应该是
aaa(pa)
@tinybit,或者它的声明应该是
int*pa
,调用后的用法应为
*pa=0。我将编辑以修复我答案中的代码。感谢您发现这一点。也许
aaa(&pa)
应该是
aaa(pa)
@tinybit,或者它的声明应该是
int*pa
,调用后的用法应为
*pa=0。我将编辑以修复我答案中的代码。谢谢你发现这个。