NULLポインタへの参照って、そのポインタにアクセスしなければOKなのでしょうか?
例えば
int &GetRef()
{
static int *p = NULL;
return *p;
}
int main()
{
int &i = GetRef();
if(&i == NULL){ // <- これはOKなのか
cout << i は 何も指していない << endl;
}
return 0;
}
上のコード、一応 i は 何も指していない と表示されます。
こういう使い方はOKなのでしょうか?
というのも参照を返したい関数で、たまたま参照する物がない場合に
NULLへの参照を返して、戻り値のアドレスをチェックすればいちいちポインタ返しに
しなくてもいいのではないかと思ったのですが、どうなのでしょう・・・?
> NULLポインタへの参照って、そのポインタにアクセスしなければOKなのでしょうか?
規格はだめだと言っています。
ISO/IEC 14882:2003 8.3.2 Reference / 4
>A reference shall be initialized to refer to valid object or function.
> というのも参照を返したい関数で、たまたま参照する物がない場合に
> NULLへの参照を返して、戻り値のアドレスをチェックすればいちいちポインタ返しに
> しなくてもいいのではないかと思ったのですが、どうなのでしょう・・・?
ポインタを最初から返せばよいような……。
ポインタを返したくないのは何故でしょう。
ちゅーか、参照ってのはポインタの「どこを指しているかわからない、どこも指してい
ないかもしれない」っていう欠点を取り除くために、「必ず指し示す先が存在する」っ
ていうことを保証するために使うものだと思ってましたが。
どこも指していないなら、なぜ参照を使うのかと…。
何か、本末転倒のような気がします。
ポインタの指し示す先がない(無効)かどうかを検査するためにNULLを使っているのに、
アドレス演算子を使って、とかで、なんか、余計わずらわしそう。
>というのも参照を返したい関数で、たまたま参照する物がない場合に
参照の意味が分かっていない。
えーとですね、ます参照を返すのは基本クラスのインターフェースがそうだからです。
別にポインタを返したくないのではなく、返せないのです。
NULLへの参照はイレギュラーなのは理解しました。
といわけで問題解決です、皆さんありがとうございます。
チェック忘れました
基本クラス側でインターフェイスのみを定義したいのであれば、
純粋仮想にすれば、良いのでは?
純粋仮想にすると派生側での実装が強制されますが、
これが困ると言うならポインターで返却するようにすべきでしょうね。
あと、こういうことは最初に書いておきましょうね。
そうすれば違った返答も期待できたと思いますよ。
> int &GetRef()
> {
> static int *p = NULL;
> return *p;
> }
> int main()
> {
> int &i = GetRef();
>
> if(&i == NULL){ // <- これはOKなのか
> cout << i は 何も指していない << endl;
> }
>
> return 0;
> }
意味不明のまま解決がチェックされちゃったけど
こんな & の書き方めちゃくちゃでしょ。ありえない
> こんな & の書き方めちゃくちゃでしょ。ありえない
なんで?
まったく正当やないの?