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代码>。我将编辑以修复我答案中的代码。谢谢你发现这个。