这段代码在VS2013和Ideone.com(http://ideone.com/g9P8J7)中都可以正常编译:
#include <list>
#include <iostream>
#include <ostream>
class Foo
{
public:
Foo(int x_ = -1) : x(x_), y(-2.3f) {}
int x;
float y;
};
int main()
{
std::list<int> myList;
myList.push_back(0);
for (auto it = std::begin(myList); it != std::end(myList); ++it)
{
Foo const& c = *it;
std::cout << c.x << ' ' << c.y << std::endl;
// output: 0 -2.3
}
}
给定输出后,似乎intmyList
会通过int构造函数隐式转换为Foo实例,然后将其绑定到引用变量c
。但是这个物体住在哪里?如果是临时的,那么为什么它在下一行仍然有效?
在此,临时对象的寿命会随着初始化引用而延长。
从标准
§12.2/ 4
在两种情况下,临时变量会在与全表达式结尾不同的时间点被销毁。第一个上下文是表达式作为定义对象的声明程序的初始化程序出现时。[...]
§12.2/ 5
第二种情况是引用绑定到临时。[...]时
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句