我正在审查一位同事的代码,我发现他在全局范围内定义了几个常量,如下所示:
const string& SomeConstant = "This is some constant text";
就我个人而言,这对我来说很糟糕,因为该引用指的是我假设是从给定 char 数组构造的“匿名”对象。
从语法上讲,它是合法的(至少在 VC++ 7 中),并且似乎可以运行,但实际上我宁愿让他删除 &,这样它在做什么就没有歧义了。
那么,这真的安全合法而且我很着迷吗?正在构造的临时对象是否有保证的生命周期?我一直假设以这种方式使用的匿名对象在使用后会被破坏......
所以我的问题也可以推广到匿名对象的生命周期。标准是否规定了匿名对象的生命周期?它与同一范围内的任何其他对象具有相同的生命周期吗?或者只给出表达式的生命周期?
此外,当作为本地人执行此操作时,其范围显然有所不同:
class A
{
string _str;
public:
A(const string& str) :
_str(str)
{
cout << "Constructing A(" << _str << ")" << endl;
}
~A()
{
cout << "Destructing A(" << _str << ")" << endl;
}
};
void TestFun()
{
A("Outer");
cout << "Hi" << endl;
}
Shows:
构造A(外);
破坏A(外层);
你好
这是完全合法的。直到程序结束它才会被破坏。
EDIT: Yes,保证:
“所有没有动态的对象
存储时间,无线程
存储持续时间,并且不是本地的
具有静态存储时间。这
这些对象的存储应持续
在计划期间
(3.6.2、3.6.3)。”
-- 2008 年工作草案,编程语言 C++ 标准,第 3.7.1 页。 63
正如马丁指出的,这并不是全部答案。标准草案进一步指出(§ 12.2,第 250-1 页):
“创建了类类型的临时对象
在各种上下文中:绑定右值
参考文献 (8.5.3) [...] 即使
临时对象的创建
被避免(12.8),所有语义
应尊重限制,如同
临时对象已创建。
[...] 临时对象被销毁
作为评估的最后一步
完整表达式 (1.9) that(词汇上)
包含他们所在的点
创建的。 [...]有两种情况
其中临时对象被销毁于
与结尾不同的点
充分表达。 [...] 第二
上下文是当引用被绑定时
到一个临时的。临时到哪个
参考已绑定或
临时的即完整的对象
引用的子对象的
是绑定持续存在的一生
除非另有说明,否则参考
以下。”
我在 g++ 中测试过这是否会让你感觉好一些。 ;)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)