由于返回对局部变量的引用,我刚刚被一个令人讨厌的未定义行为所困扰。
我们知道这是邪恶的,通常编译器会打印出一个很好的信息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]