typedef double real8;
typedef real8 Real_t;
Real_t& x(int y);
なにReal_t&
?参照渡しを示すために「&」が後に続くデータ型のみを見ました。しかし、これは宣言行にあります。これは何を意味するのでしょうか ?
typedef double real8;
typedef real8 Real_t;
Real_t& x(int y);
なにReal_t&
?参照渡しを示すために「&」が後に続くデータ型のみを見ました。しかし、これは宣言行にあります。これは何を意味するのでしょうか ?
Real_t
これは、関数が実際にはであるaへの参照を返すことを意味しますdouble
。これReal_t
は、すべてのtypedefを解決する場合real8
のaです。double
ここでは注意が必要です。参照によって渡される結果が、関数の終わりを超えて存在するスコープから取得されない場合は、ぶら下がっている参照があります。
例えば:
int& foo() {
int x = 8;
return x;
}
int main() {
int y = foo();
}
y
mainの変数、は、foo()
返されるときにスコープ外になったために破棄された変数を参照することになります。したがって、それを使用することは未定義の動作です。x
シングルトンまたは関数の範囲外にあるものから取得された場合foo()
でも、それはまだ存在しているので、これで問題ありません。
人々は時々、コンパイルユニット間で決定論的な方法で静的グローバルを初期化するための参照を返すので、これが次のような静的変数で使用されているのを見るかもしれません。
MyClass& MyStaticVar() {
static MyClass instance;
return instance;
}
初期化後のプログラムの期間中、スタティックは存続するため、これも問題ありません。
これx
は、への参照を返す関数であることを意味しますReal_t
。
参照による戻りの例は、クラスでのデータアクセスの場合です。たとえば、std :: vector :: at()は、ベクトルの要素への参照を返します。
無料の関数が安全に参照を返すためには、ぶら下がっている参照が返されないようにするために、関数内で何か非自明なことが起こっている必要があります。