C ++で参照を参照に渡すのは違法だと思いますが、このコードを実行してもエラーは発生しません。
void g(int& y)
{
std::cout << y;
y++;
}
void f(int& x)
{
g(x);
}
int main()
{
int a = 34;
f(a);
return 0;
}
g() の仮パラメータは参照への参照として適格ではありませんか??
C ++で参照を参照に渡すのは違法だと思いますが、このコードを実行してもエラーは発生しません。
void g(int& y)
{
std::cout << y;
y++;
}
void f(int& x)
{
g(x);
}
int main()
{
int a = 34;
f(a);
return 0;
}
g() の仮パラメータは参照への参照として適格ではありませんか??
の本体では、式f
の値はです。変数に型があるという事実は、式の値が左辺値であることを意味するため、関数のパラメーターにバインドできます。 x
int
x
int &
g
いいえ、g()
参照への参照を取っているわけではありません。への参照を取りますint
。は、受信したf()
への参照を に転送します。int
g()
「参照への参照」は実際には存在しませんが、参照に似ていますが、一時的なものへのバインドを許可する右辺値参照があります。
1) 参照を参照に渡すことに問題はありません (実際には右辺値参照と呼ばれますが、移動コンストラクターと移動代入演算子が使用するものです)。
2)あなたがしていることは、参照に参照を渡すことではなく、同じ参照をf
に渡すことg
です:
void g(int& x)
{
x = 5;
}
void f(int& x)
{
std::cout << "f-in " << x << std::endl;
g(x);
std::cout << "f-out " << x << std::endl;
}
int main()
{
int x = 42;
f(x);
std::cout << "New x = " << x << std::endl;
}
参照は、別のオブジェクトへのエイリアスです。参照が初期化されると、オブジェクトに直接アクセスしている場合とまったく同じように動作するため、参照への参照ではなく、実際のオブジェクトへの参照を渡します (別の参照によって参照されます)。
参照への参照を作成すると、次のようになります。
typedef int& intr;
void f(intr& x); // reference to a reference type
コードのどこにも参照への参照を渡そうとしません。内部f
式x
は、型の左辺値を生成しint
ます。参考にはなりません。参照型の結果は言語によって非参照型の左辺値として即座に解釈されるため、C++ の式はアクセス可能な参照型の結果を生成しません。
5/5参照
式が最初に「T への参照」型 (8.3.2、8.5.3) を持っている場合、その型は、さらなる分析の前に T に調整されます。式は参照によって示されるオブジェクトまたは関数を指定し、式は式に応じて左辺値または x 値です。
PS 「g() の仮パラメーターが参照への参照として適格ではない」という意味がわかりません。の仮パラメータはg
として宣言されていint &
ます。ここで「参照への参照」はどこに表示されますか?