此代码在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
}
}
给定输出,似乎来自myList
的int通过int构造函数隐式转换为Foo实例,然后绑定到引用变量c
。但是这个对象住在哪里?如果它是暂时的,为什么它在下一行仍然有效?
答案 0 :(得分:5)
似乎来自
myList
的int通过int构造函数隐式转换为Foo实例,然后绑定到引用变量c
。
是的,这正是发生的事情。
但这个对象住在哪里?
未指定,但它必须表现得像一个与引用具有相同作用域的自动变量,所以可能在堆栈上就像一个自动变量。
如果它是暂时的,为什么它在下一行仍然有效?
因为如果用于初始化const
引用,则隐藏规则会导致临时的生命周期延长。它的生命周期延长到与参考相匹配。
答案 1 :(得分:3)
这里临时对象的生命周期在初始化引用时被扩展。
来自标准
§12.2/ 4
有两种情况下,临时状态被摧毁 不同点比完全表达结束。第一个背景 是表达式作为声明符的初始值设定项出现的情况 定义一个对象。 [...]
§12.2/ 5
第二个上下文是指 引用绑定到临时 。[...]
答案 2 :(得分:1)
临时返回(int将被转换为Foo)绑定到引用c。这意味着临时的生命时间延长到c的生命时间。