类型 'std::string*& {aka std::basic_string<char>*&}' 的非const 引用从'std::string* {aka

sho*_*ace 1 c++ pass-by-reference

我试图解决这个问题,我必须拼写数字。
当我尝试a通过引用调用我的字符串数组时,出现此错误。但是如果我按值调用它,我不会出错。
我不知道 rvalue 来自哪里,因为我的字符串元素应该被视为左值。

#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();
}
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 5

首先,调用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)

现场演示