§12.2/ 5(我的重点)
第二种情况是引用绑定到临时项时。引用绑定到的临时对象或引用绑定到的子对象的完整对象的临时对象在引用的生存期内一直存在,但以下情况除外:
- 临时绑定到参考...
- 在函数调用(5.2.2)中,绑定到参考参数的临时绑定将一直持续到包含该调用的完整表达式完成。
在下面的代码片段(实时示例)中,您可以看到A()
在引用a
的生存期内临时对象已绑定到引用,即在函数~A()
的末尾调用了析构函数f
。
#include <iostream>
struct A{
A() { std::cout << "A()" << '\n'; }
~A() { std::cout << "~A()" << '\n'; }
};
void f(A&& a) { std::cout << "f()" << '\n'; }
int main()
{
f(A());
}
考虑这个荒唐的例子:
#include <iostream>
struct A {
void bar() { std::cout << "bar [" << i << "]" << std::endl; }
~A() { std::cout << "dtor" << std::endl; }
int i;
};
A& foo(A&& a) { return a; }
int main()
{
foo(A{4}).bar();
}
如果临时对象的生存期没有延长到完整表达式的完成时间,.bar()
则将在已经销毁的对象上调用该对象,因为a
end的生存期将在foo
完成时结束。就这样,将打印:
bar [4]
dtor
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句