ローカル変数への参照を返すため、厄介な未定義の動作に噛まれたところです。
私たちはそれが悪であることを知っています、そして一般的にコンパイラはwarning
私たちにそれを伝えるためにいいものを出力します...まあgcc(3.4.2)はチェックをあまり押し付けていないようです。
std::string get_env_value(std::string const& key);
std::string const& get_phase()
{
std::string const& phase = get_env_value("PHASE"); // [1]
std::cout << "get_phase - " << phase << '\n';
return phase; // [2]
}
これはグリッチなしでコンパイルされますが、それでも未定義の動作という厄介な領域に陥ります。
[1]
標準では、const参照にバインドされた変数の有効期間を延長して、const参照の有効期間と一致させる必要があると指定されているため、行は問題ありません。
ライン[2]
も大丈夫そうです...
- C ++仕様はこのケースをカバーしていますか?
- これが通常診断されるかどうか誰かが知っていますか?(私は旗か何かを逃すかもしれません...)
静的分析では、に「寿命延長」を使用することは安全ではないことがわかるはずですが[1]
、[2]
急速に醜くなる可能性があると思います...