【发布时间】:2022-01-16 05:48:26
【问题描述】:
以下代码无法编译:
void function(const char*& i){
// do something
}
int main() {
char a = 'a';
char *p = &a;
function(p);
return 0;
}
谁能给我解释一下为什么? 代码在做什么?主函数中的代码将一个普通的指向 char 的指针传递给指向一个常量 char 的指针。
据我所知,只要传递的指针在函数中没有被违反,就应该允许调用。
指向char的普通指针的地址和值可以被修改,因此如果通过引用传递给唯一参数是指向常量char的指针的函数,则不能违反这样的指针,因为这样的指针只能修改其地址, 并且不违反指向 char 的普通指针的限制。
编辑: 它不编译的原因是当 char* 转换为 const char* 时,它会产生一个 const char* 类型的右值。在 C++ 中,非常量引用不能附加到右值。 所以解决方案就是简单地通过添加 const 来使引用常量为参数提供类型常量指针 ... 到一个常量。
void function(const char* const& i){
// do something
}
int main() {
char a = 'a';
char *p = &a;
function(p);
return 0;
}
【问题讨论】:
-
有人会说“指向常量的指针应该只存储常量字符的地址”,这很有道理,但是在上面的代码中,我只需要删除与符号即可启用要编译的代码。所以按值传递可以正常工作。此外,如果参数是 const char* const& 或 char*const&,代码也可以正常编译。
-
你的函数需要一个
const char*类型的指针,但你传递给它的是一个非常量char*。这意味着p应该是const char*类型。 -
如果您确实发布了编译器错误,这将有所帮助。
-
"cannot convert argument 1 from 'char *' to 'const char *&'" 是来自 CLion 的错误信息,但我的问题是为什么?
-
“const char*&”类型的引用不能用“char*”类型的值初始化,但“const char* const&”类型的引用可以用类型的值初始化“字符 *” 。我的问题是为什么?