首页 > 解决方案 > '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();
}

标签: c++pass-by-reference

解决方案


首先,调用main()是非法的,未定义的行为return main();也是如此。如果您想多次运行 的代码,请使用循环。do..whilemain()

string[]当数组衰减string*指向第一个元素的指针时,编译器抱怨的右值出现在传递给spell(). 您的声明a是一个非常量左值引用,它不能绑定到右值,因此会出现编译器错误。

spell()不会修改a自己指向其他地方,它只是访问指向string的数组中的对象a,所以不需要a通过引用传递,通过值传递就可以了:

void spell(int n, string* a)

现场演示

或者,通过const引用传递它也可以,因为 const 左值引用可以绑定到右值:

void spell(int n, string* const &a)

现场演示


推荐阅读