【发布时间】:2010-11-04 22:24:27
【问题描述】:
我正在查看一位同事的代码,我看到他在全局范围内定义了几个常量:
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;
}
演出:
构造A(外部); 破坏A(外); 嗨
【问题讨论】:
-
有人能回答为什么它比-不-使用参考更可取吗?
-
不是。或者更确切地说,该标准基本上说,如果它是全局的,则它具有几乎相同的语义。 (即,临时的生命周期绑定到它所绑定的 const 引用的生命周期,或类似的东西。)
-
但是,在这种情况下,您会多花 4 个字节,不是吗? 4作为参考和幕后临时的空间?
-
请定义“匿名对象”的含义。该术语不在标准中。
-
他将其作为参考的原因是什么?
标签: c++ string object constants anonymous