我想检查一下我对此事的理解和结论.
在IRC上,有人问:
绑定到临时对象
const_cast的const引用是否可以接受?
翻译:他有一个临时的ref-to-const,他想抛弃它const来修改它.
我的回答是我之前曾问过一个类似的问题,其中的共识似乎是临时性本身并不是天生的const,因此你可以抛弃const你对它们的引用的性质,并通过结果修改它们.而且,只要原始参考const仍然存在,这不会影响临时的生命周期.
那是:
int main()
{
const int& x = int(3);
int& y = const_cast<int&>(x);
y = 4;
cout << x;
}
// Output: 4
// ^ Legal and safe
Run Code Online (Sandbox Code Playgroud)
我对吗?
(当然,这些代码是否真的是可取的完全是另一回事!)
我正在审查一个同事的代码,我发现他在全球范围内定义了几个常量:
const string& SomeConstant = "This is some constant text";
Run Code Online (Sandbox Code Playgroud)
就个人而言,这对我来说闻起来很糟糕,因为引用是指我假设的是一个从给定的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;
}
Run Code Online (Sandbox Code Playgroud)
显示:
构建A(外部); 破坏A(外); 你好