C++: 为什么不能将char **转换为const char **?

7
我知道const char * p的意思是我们不能通过p去改变它所指向的值。
现在我正在写一个函数,它将接受main函数的参数。也就是说,这个函数将会接受一个char **。所以我写了这个函数:void func(const char **);。但是当我把main函数的参数传递给这个函数时,我遇到了一个错误:
error C2664: 'void func(const char **)' : cannot convert argument 1 from 'char **' to 'const char **'

我只想用一个非常量指针初始化一个常量指针。这应该是可行的。如果我们做相反的事情,应该会出现一些错误。但现在我不知道为什么会出现这个错误。


你需要展示给我们产生错误的代码! - David Schwartz
您的标题似乎与问题正文不符。 - Lightness Races in Orbit
1个回答

13

我只是想用一个非常量指针来初始化一个常量指针。这应该可以工作。

不,你想做的不是这个。

你在试图用一个非常量指向非常量的指针来初始化一个指向常量字符的非常量指针。这是永远不会隐式执行的。为什么?这在其他地方已经有很好的文档记录因为这并不完全符合直觉,但简而言之,如果允许将char**转换为const char**,那么就会破坏const正确性。

这与你认为自己正在尝试做的将char**转换为char** const不同。

遗憾的是,main的参数中没有const修饰符。不过幸运的是,你可以通过使用const_cast来解决它:

void foo(const char** argv) {}

int main(int argc, char** argv)
{
   foo(const_cast<const char**>(argv));
}

这是一种情况,使用const_cast来绕过预先存在的愚蠢,违背类型系统的意愿,实际上是可以的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接