我知道const char * p
表示我们无法更改p
到p
指向的值。
现在我正在编写一个函数,它将获取函数main
的参数。这意味着此函数将采用char **
。所以我写这个函数是这样的:
void func(const char **);
。
但是当我将main
的参数传递给它时,我收到一个错误:
error C2664: 'void func(const char **)' : cannot convert argument 1 from 'char **' to 'const char **'
我只想用const
指针初始化non-const
指针。这应该是有效的。如果我们做相反的事情,我们应该得到一些错误。但现在我不知道为什么会出现这个错误。
答案 0 :(得分:10)
我只想用非const指针初始化一个const指针。这应该是有效的。
这不是你想要做的事,不。
您尝试初始化指向const
指针的非const char
指针,指针指向const
的非char
指针。这绝不会隐式执行。 为什么的? It's well documented elsewhere因为它并非完全直观,但简而言之,如果允许将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
来破解预先存在的愚蠢的情况之一,与类型系统的愿望相反,实际上是可以的。