由于返回对局部变量的引用,我刚被一个令人讨厌的未定义行为所困扰.
我们知道它是邪恶的,通常编译器打印出一个很好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]
}
Run Code Online (Sandbox Code Playgroud)
这编译没有故障,但我们陷入了未定义行为的讨厌境界.
行[1]是可以的,因为标准指定应该扩展绑定到const引用的变量的生命周期以匹配const引用的生命周期.
线[2]似乎也好......
在我看来,静态分析应该能够告诉我使用"终身扩展" [1],这[2]是不安全的,但它可能会很快变得丑陋我猜...
该标准不包括在内[2].它允许将rvalue绑定到const引用,但是这不允许返回const引用并且具有它被绑定扩展的rvalue的生命周期.
真实的,静态分析可以捕捉到这一点,但一如既往地是一种权衡.C++编译本身就足够慢,因此编译器编写者必须权衡进一步静态分析的好处,这可能使他们能够针对增加的编译时间产生更好的诊断.
| 归档时间: |
|
| 查看次数: |
381 次 |
| 最近记录: |