invalid initialization of non-const reference of type ‘xxx&’ from an rvalue of type ‘xxx’


これは私がc++を学ぶ过程の中でかつて出会った1本のLinux环境の下のコンパイルの间违いは最初この间违いの意味が何なのか分からないで、debugは半日も出ていないで、ネット上で百篇を読んで、やっとこの间违いの意味を知って、すぐにバグを探し出しました.そのため、このエラーメッセージを直接タイトルとして、後で検索して調べることができます.
  • このエラーの中国語の意味は、非常に引用された初期値は左値(vsのエラー)
  • でなければならない.
  • 最も一般的な原因は2つあります:
  • 定数に対する参照を宣言します.たとえば、
    #include 
    using namespace std;
    
    int main()
    {
        int& i = 10;//     vs    :              
        /* Linux  invalid initialization of non-const reference of  type ‘int&’ from an rvalue of type ‘int’*/
        return 0;
    }

    解決策
    #include 
    using namespace std;
    
    int main()
    {
        int x = 10;
        int& i = x;
    
        return 0;
    }

    引数が非常に多い参照タイプの関数に定数タイプを入力します.たとえば、
    #include 
    using namespace std;
    
    void fun(int& i)
    {
        cout << i;
    }
    
    int main()
    {
        fun(1);//     vs    :              
        /* Linux  invalid initialization of non-const reference of  type ‘int&’ from an rvalue of type ‘int’*/
        return 0;
    }

    また
    #include 
    #include 
    using namespace std;
    
    void fun(string& i)
    {
        cout << i;
    }
    
    int main()
    {
        fun("str");//     vs    :              
        /* Linux  invalid initialization of non-const reference of  type ‘string&’ from an rvalue of type ‘string’*/
        return 0;
    }

    解決策はすべてパラメータの前にconstキーワードを追加します
    #include 
    #include 
    using namespace std;
    
    void fun(const int& i)
    {
        cout << i;
    }
    
    int main()
    {
        fun(1);
    
        return 0;
    }
    #include 
    #include 
    using namespace std;
    
    void fun(const string& i)
    {
        cout << i;
    }
    
    int main()
    {
        fun("str");
    
        return 0;
    }

    だから、コードを書いてconstを手当たり次第に加えるのは良い習慣で、bugをコンパイルの揺りかごの中で殺します.