Я просматриваю код коллеги и вижу, что у него есть несколько констант, определенных в глобальной области видимости как:
const string& SomeConstant = "This is some constant text";
Лично для меня это плохо пахнет, потому что ссылка относится к тому, что я предполагаю, является «анонимным» объектом, созданным из заданного массива символов.
Синтаксически это законно (по крайней мере, в 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 (Внешний); Привет