c++ - 'std::string*& {aka std::basic_string 类型的非常量引用的初始化无效*&}' 来自 'std::string* {aka
问题描述
我正在尝试解决这个我必须拼写数字的问题。
当我尝试a
通过引用调用我的字符串数组时,出现此错误。但是如果我按值调用它,我不会出错。
我不知道右值来自哪里,因为我的字符串元素应该被视为左值。
#include <iostream>
#include <string>
using namespace std;
void spell(int n,string* &a){
if(n==0)
return;
spell(n/10,a);
cout<<a[n%10];
}
int main(){
int n;
cin>>n;
string a[10]{"zero ","one ","two ","three ","four ","five ","six ","seven ","eight ","nine "};
spell(n,a);
if(n<0)
return 0;
return main();
}
解决方案
首先,调用main()
是非法的,未定义的行为return main();
也是如此。如果您想多次运行 的代码,请使用循环。do..while
main()
string[]
当数组衰减为string*
指向第一个元素的指针时,编译器抱怨的右值出现在传递给spell()
. 您的声明a
是一个非常量左值引用,它不能绑定到右值,因此会出现编译器错误。
spell()
不会修改a
自己指向其他地方,它只是访问指向string
的数组中的对象a
,所以不需要a
通过引用传递,通过值传递就可以了:
void spell(int n, string* a)
或者,通过const
引用传递它也可以,因为 const 左值引用可以绑定到右值:
void spell(int n, string* const &a)
推荐阅读
- django - 如果用户在使用 Django ORM 的日期范围内有产品,如何计算用户?
- c# - Stripe 出错:没有这样的 payment_intent: 'my payment intent id'
- gcc - 用 musl 构建 MariaDB:/usr/bin/ld 找不到 -lgcc_s
- python - 如何在 Python 中检查 type() 方法的返回值?
- sql-server - 将 SQL Server .bak 文件导出到共享点链接
- android - 如何检查自定义视图是否有禁用的父级?
- git - 找不到我提交了一些更改的独立头分支
- java - 带箭头键的基本动画
- python - 我不太确定如何使用 Twine 将我的项目上传到 testpypi
- react-native - 解析 JSON 的困难 3 个级别