1. ホーム
  2. c++

[エラー] 'int*' から 'int' への無効な変換 [-fpermissive] 問題

2022-02-15 17:24:23
<パス

このエラーは、定数でない参照の初期値が、左の値でなければならないことを意味します
代表的な原因は以下の2つです。

のような定数への参照を宣言しています。

#include <iostream>
using namespace std;

int main()
{
    int& i = 10;//this is usually reported as an error in vs: the initial value of a non-const reference must be a left value
    /* In Linux it is invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int '*/
    return 0;
}


ソリューション

#include <iostream>
using namespace std;

int main()
{
    int x = 10;
    int& i = x;

    return 0;
}


引数が非定数の参照型である関数の中で、定数型を渡す、例えば

#include <iostream>
using namespace std;

void fun(int& i)
{
    cout << i;
}

int main()
{
    fun(1);//this is usually reported as an error in vs: the initial value of a non-const reference must be a left value
    /* In Linux it is invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int '*/
    return 0;
}


もう一つの例は

#include <iostream>
#include <string>
using namespace std;

void fun(string& i)
{
    cout << i;
}

int main()
{
    fun("str");//this is usually reported as an error in vs: the initial value of a non-const reference must be a left value
    /* In Linux it is invalid initialization of non-const reference of type 'string&' from an rvalue of type ' string'*/
    return 0;
}


解決策は、パラメータの前に const キーワードを追加することです。

#include <iostream>
#include <string>
using namespace std;

void fun(const int& i)
{
    cout << i;
}

int main()
{
    fun(1);

    return 0;
}

#include <iostream>
#include <string>
using namespace std;

void fun(const string& i)
{
    cout << i;
}

int main()
{
    fun("str");

    return 0;
}


コンパイラでは、我々は変数への参照をバインドするとき、それは参照がバインドされている一時的な変数を作成し、我々は知っているように、データの一部に参照をバインドした後、参照が読み取りと書き込み(変更)を含む、データに対して操作するために使用することができます、特に、書き込み操作は、データの値を変更します。と一時的なデータは、しばしばアドレス指定可能ではない、一時的な変数、その後変更を作成する一時的なデータであっても、書き込むことができない一時的な変数内のデータのみ、元のデータには影響しません、これは、元のデータへの参照は、同期的に更新することはできませんにバインドされ、最終的に2つの異なるデータを生成、参照、コンパイラのセキュリティ機構ですの意味が失われました。

そして、この参照にconst定数属性を与えることで、この一時変数のデータは変更できないので、もちろんコンパイルは正常に行われます。

だから、参照引数を取る関数は、コンパイルのゆりかごでバグを潰すために、constを付けながら使う習慣を身につけるといいんだ。