有效并发:使用锁定层次结构来避免死锁有效 并发:打破Amdahl定律! »GotW#88:“大多数人”的候选人 重要的常数“2008-01-01作者:Herb Sutter一位朋友最近问我 以下示例1是否合法,如果是,则意味着什么。它导致了一个 很好的讨论我以为我会发布在这里。因为它接近GotW 已经风格了,我以为我会在所有这些之后做另一个名誉 年...不,我还没有重新开始写作的新年决议 常规的GotWs。 : - )
JG问题Q1:以下代码是否合法C ++?
A1:是的。这是一个C ++特性......代码是有效的,完全正确 它似乎做了什么。// Example 1 string f() { return "abc"; } void g() { const string& s = f(); cout << s << endl; // can we still use the "temporary" object? }
通常,临时对象只会持续到完全结束 它出现的表达方式。但是,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;
}
然而,它显然很好用。
那么,“它对于作为对象成员的引用不起作用”是什么意思?
答案 0 :(得分:5)
这意味着如果你这样做:
string f() { return "abc"; }
struct foo {
string const & _s;
foo() : _s(f()) {}
};
它不会延长从f
返回的临时生命。参考文献_s
会摇摆不定。
延长临时使用寿命是具有自动存储持续时间的引用属性。即函数范围内的局部变量。