[エラー] '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を付けながら使う習慣を身につけるといいんだ。
関連
-
[解決済み】出力ファイルを開くことができない、権限がない
-
[解決済み] オーバーロードされた関数の複数のインスタンスが引数リストに一致する。
-
[解決済み] テンプレート・パラメータに依存する引数が存在しない
-
[解決済み] c++のiostreamヘッダーのcout, cerr, clogの違いは何ですか?いつ、どれを使うのですか?
-
[解決済み] エラーです。非静的メンバ関数への参照を呼び出す必要があります (2)
-
[解決済み] glmを用いた四元数から行列への変換
-
[解決済み] C++でuint()関数はどこですか?
-
[解決済み] 依存するスコープ。前にtypenameが必要。
-
[解決済み] クラス 'Soldier' で宣言されたプライベートメンバにアクセスできません。
-
[解決済み] this' ポインタを 'const Line' から 'Line &' に変換できない?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン