草药萨特:
有效并发:使用锁定层次结构来避免死锁有效并发:打破Amdahl定律!»想要#88:候选人对于"最重要的常规"2008-01-01作者:Herb Sutter一位朋友最近问我下面的例子1是否合法,如果是的话是什么意思.它引发了一个很好的讨论,我想我会在这里发布.因为它已经接近GotW风格了,所以这些年后我还以为我会做另一个名誉......不,我没有做出新年决议来恢复写作常规的GotWs.:-)
JG问题Q1:以下代码是否合法C++?
Run Code Online (Sandbox Code Playgroud)// Example 1 string f() { return "abc"; } void g() { const string& s = f(); cout << s << endl; // can we still use the "temporary" object? }A1:是的.这是一个C++特性......代码是有效的,并且完全符合它的样子.
通常,临时对象仅持续到它出现的完整表达式的结尾.但是,C++故意指定将临时对象绑定到堆栈上对const的引用会延长临时对象生命周期的生命周期,从而避免了常见的悬空引用错误.在上面的示例中,f()返回的临时值一直持续到结束大括号.(注意,这仅适用于基于堆栈的引用.它不适用于作为对象成员的引用.)
最初,我认为最后一句意思是:
class A
{
public:
int x;
A(const int& x_)
{
x = x_;
}
};
int main()
{
A a(1); // assign lvalue to const int&
std::cout << a.x;
}
Run Code Online (Sandbox Code Playgroud)
但是,它显然很好用.
那么,"它对于作为对象成员的引用不起作用"是什么意思?
这意味着如果你这样做:
string f() { return "abc"; }
struct foo {
string const & _s;
foo() : _s(f()) {}
};
Run Code Online (Sandbox Code Playgroud)
它不会延长从中返回的临时寿命f.参考文献_s将悬挂起来.
延长临时工作的寿命是具有自动存储持续时间的参考的属性.即功能范围内的局部变量.
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |