视觉C++,需要错误原因:无法将参数 1 从 'char *' 转换为 'const char *&'

visual C++, Need Reason for error : cannot convert parameter 1 from 'char *' to 'const char *&'

本文关键字:char const 转换 参数 C++ 错误 视觉      更新时间:2023-10-16

为什么不能将指向字符的指针->转换为指向常量字符的指针的引用

我很想知道当我们调用foo_ptr时语法错误的原因。当允许foo_char时,为什么不允许foo_ptr呢?
(更新1。我很高兴知道foo_char()起作用的原因,为什么foo_ptr()不起作用…当指针出现在图片中会发生什么?

(更新2。)

在Dev c++编译器4.9.9.2版本中也不能工作。
//code
//OS : Win XP
//Env: VC++ 2008 
//NOT ALLOWED
void foo_ptr(const char * & ptr) //reference to a pointer to a constant character         
{         
        return;         
}        

//allowed        
void foo_char(const char & p_Char) //reference to a constant character        
{         
        return;        
}        
int main()        
{        
        char ch = 'd';        
        char *ptr =  "anu";        
        foo_char(ch);         
        foo_ptr(ptr); //NOT ALLOWED syntax error, vc++, 2008        
        return 0;        
}        

假设你有

void foo_ptr(const char * & ptr)
{         
    ptr = "readonlystring";
}        

你现在叫它

    char *ptr;
    foo_ptr(ptr);
    *ptr = 0;

假设没有抛出错误。您正在写入一个只读字符串,在没有任何强制转换的情况下违反了类型系统。

这基本上是CV版本的:为什么派生类的指针不能传递给期望引用基类指针的函数?

用更多的例子修改:Raymond Chen提供了正确答案。通过传递一个非const指针(char *)作为const指针(foo_ptr(const char * &param))的引用参数,你可能会返回一个const指针类型(const char *),编译器不会允许你这样做。

下面是Raymond Chen的例子,但是我试图通过添加额外的注释和代码来解释编译时会出现什么问题:

void foo_ptr(const char * & ptr)
{         
    //Valid assignment, and the char * is now pointing to a const
    //array of "readonlystring"
    ptr = "readonlystring";
}   
...
//inside main
char *ptr = malloc(10*sizeof(char));
//See you can edit ptr, it's not const.
ptr[0] = 'a';
ptr[1] = 'b';
//this should not compile, but lets assume it did..
foo_ptr(ptr);
//Oh no, now ptr[0] is 'r' inside of constant memory,
//but now since ptr isn't declared const here I can overwrite it!
//But luckily most (all?) compilers actually fail to compile this code.
ptr[0] = 'b';

但是如果你改变形参,使你不能影响指针指向的值,那么编译器会让你传递一个非const,因为没有机会返回const值的指针。

通过将关键字const放在参数减速中的*之后,您可以做到这一点。这意味着改变:

void foo_ptr(const char * & ptr)

void foo_ptr(const char * const & ptr)

,你的编译器会很高兴。

现在您将无法执行上面示例中的ptr = "readonlystring",因为它现在永远不会编译。根据你的问题,这应该是OK的,因为你将无法在你的原始示例中对const char &进行分配。

永远不要将字符串文字赋值给非const char指针,就像下面这样:

 char *ptr =  "anu";        

将上面的代码改为正确的代码:

 const char *ptr =  "anu";        

…我想你会发现你的问题都解决了。