gpt4 book ai didi

c++ - 从类型 'const char*&' 的右值初始化类型 'const char *' 的非常量引用无效

转载 作者:太空宇宙 更新时间:2023-11-04 16:08:35 24 4
gpt4 key购买 nike

我做了一个mystrcpy函数,

void mystrcpy(char *&stuff, const char *&otherstuff){
for(int i=0; stuff[i]&&other[i]; i++){
stuff[i]=other[i];
}
}

还有一个主要功能:

int main(){
char *hello="hello";
mystrcpy(hello, "bye bye"/*<--i have no clue what data type this really is!!*/);
printf("%s\n", hello);
return 0;
}

它不编译,并说“从'const char *'类型的右值初始化'const char *&'类型的非常量引用无效”...

当我做的时候:

const char *bye="bye bye";
mystrcpy(hello, bye);

它编译没有错误。

我需要知道为什么前一个不起作用,谢谢。

最佳答案

const char *& 是对 char const * 的非const 引用。 "bye bye" 的类型是 char const[8](大小包括终止空字符)。您对 mystrcpy 的调用会将 char const [8] 隐式转换(或衰减)为 char const * ,但这会产生一个右值指针,您不能将其绑定(bind)到非 const 引用参数。

如果您将函数签名更改为

void mystrcpy(char *&, const char * const&)
// ^^^^^ const reference

您的代码将会编译。同样,如果您按值获取指针,您的代码将编译

void mystrcpy(char *, const char *)

一旦你修复了所有这些问题,你的代码将编译并可能在运行时崩溃,因为你有未定义的行为。

char *hello="hello";

C++11 禁止您将字符串文字转换为 char *,在 C++03 中这是不推荐的行为。不仅如此,您的 mystrcpy 调用还会尝试覆盖字符串文字,这又是未定义的行为。

调高编译器的警告级别,并注意警告。 g++ 使用 -pedantic

为上面的行生成以下警告

warning: ISO C++ forbids converting a string constant to 'char*' [-Wpedantic]

 char *hello="hello";
^

关于c++ - 从类型 'const char*&' 的右值初始化类型 'const char *' 的非常量引用无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31412101/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com