这段代码在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
}
}
给定输出,似乎 int 来自 myList
的 int 通过 int 构造函数隐式转换为 Foo 实例,然后将其绑定到引用变量 c
。但是这个物体住在哪里呢?如果它是临时的,那么为什么它在下一行仍然有效?
似乎来自
myList
的 int 正在通过 int 构造函数隐式转换为 Foo 实例,然后将其绑定到引用变量c
.
是的,这正是发生的事情。
但是这个物体住在哪里呢?
未指定,但它的行为必须像与引用具有相同范围的自动变量,因此可能在堆栈上就像自动变量一样。
因为如果临时用于如果它是临时的,那么为什么它在下一行仍然有效?
初始化const
引用,则模糊规则会导致临时的生存期延长。其寿命延长以匹配基准。
在这里,临时对象的生存期在初始化引用时会延长。
从标准
§12.2/4
在两种情况下,临时人员在 与完整表达式的结尾不同。第一个上下文 是当表达式显示为声明符的初始值设定项时 定义对象。[...]
§12.2/5
第二个上下文是当引用绑定到临时时。[...]
临时返回的 (int 将被转换为 Foo) 绑定到引用 c。这意味着临时的生命周期延长到 c 的生命周期。