2011-08-01 1 views
7

これは安全ですか?これは安全ではない - 私は何をしようとしている定数参照でリテラルを返すことはできますか?

const int& f() 
{ 
return 1; 
} 

+2

なぜこれをやりたいですか? –

+0

可能な複製[const参照を返す方が効率的ですか](http://stackoverflow.com/questions/275795/is-it-more-efficient-to-return-a-const-reference) – iammilind

+0

可能な複製[C++はConst参照渡しとConst参照渡し](http://stackoverflow.com/questions/3216948/c-pass-by-const-reference-and-return-by-const-reference) – stijn

答えて

8

大丈夫です。
関数の外部にアクセスすると、の未定義の動作が発生するため、一時的な参照の参照は正しくありません。

+1

@mkaes:何スティーブJessopは言った。技術的な理由は、実際には関数の結果参照の生涯拡張が非常にコストがかかることです。実装は、例えば、関数内の静的変数であるが、参照が消えた後、ストレージが割り当てられ、理想的に割り当て解除されたことを、呼び出し元のマシンコードに対して透過的であるようにしなければならない。私はそれが理論的に不可能だとは思わない。しかし、技術的に可能であれば、実際には非常にコストがかかるでしょう。 –

+0

@スティーブ:同意します。私はもっ​​と慎重に読むべきです。削除された間違ったコメント – mkaes

+0

'1'は一時的ですか? 'int x = 1; return x; 'は一時的に戻りますが、' return 1'は異なります。 '1'はどこに住んでいますか?たぶん、すべてのリテラルは、永遠に安全な静的な空間です。たとえば、 'const char * foo(){return"一時的ですか? } ' –

2

&いいえ、あなたは一時変数への参照を返しているのconstためにいくつかの値を返すことです。関数の復帰時に一時変数が破棄されます。

関連する問題