同僚のコードをレビューしていて、グローバル スコープで次のようにいくつかの定数が定義されていることがわかりました。
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(外側)を破壊する; やあ