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

anu*_*v16 12 c++ pointers reference visual-c++

乳清我们不能将指针转换为字符 - > TO->对指向常量字符的指针的引用

当我们调用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;        
}        
Run Code Online (Sandbox Code Playgroud)

Ray*_*hen 10

假设你有

void foo_ptr(const char * & ptr)
{         
    ptr = "readonlystring";
}        
Run Code Online (Sandbox Code Playgroud)

你现在称之为

    char *ptr;
    foo_ptr(ptr);
    *ptr = 0;
Run Code Online (Sandbox Code Playgroud)

假设没有引发错误.您正在写入只读字符串,违反了没有任何强制转换的类型系统.

这基本上是CV版本如何才能将指向派生类的指针传递给期望引用指向基类的指针的函数?.

  • 哦,你的意思是在foo_ptr中替换它.那是因为`const char*&`与`const CHARPTR&`不一样.前者是对指向`const char`的指针的引用.后者是指向`char`的指针的const引用.所以这是一个不同的功能. (2认同)

Jam*_*mes 2

修改了更多示例: 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';
Run Code Online (Sandbox Code Playgroud)

但是,如果您更改参数,这样就不会影响指针指向的值,那么编译器将让您以非常量传递,因为不可能返回常量值指针。

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

void foo_ptr(const char * & ptr)
Run Code Online (Sandbox Code Playgroud)

void foo_ptr(const char * const & ptr)
Run Code Online (Sandbox Code Playgroud)

你的编译器会很高兴。

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