从'std::string*{aka std::string*& {aka std:::basic_string<char>*&}'类型的r值初始化无效的非const引用。

问题描述 投票:0回答:1

我正试图解决这个问题,我必须拼数字。当我试图调用我的字符串数组时 a 引用,我得到这个错误。但是如果我用value调用它,我没有得到任何错误。我不知道r值从哪里来,因为我的字符串元素应该被视为l值。

#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
1个回答
5
投票

首先。呼叫 main() 违法所以 return main();未定义行为. 使用 do..while 循环,如果你想运行 main()的代码中多次出现。

编译过程中抱怨的r值是当 string[] 阵列 衰变 变成 string* 传递给第1个元素的指针。spell(). 你的声明 a 是一个非const的lvalue引用,它不能被绑定到rvalue上,因此编译器出错。

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

void spell(int n, string* a)

现场演示

或者,路过 const 引用也可以使用,因为const lvalue引用可以绑定到rvalue。

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

现场演示

© www.soinside.com 2019 - 2024. All rights reserved.