此代码在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
}
}
Run Code Online (Sandbox Code Playgroud)
给定输出,似乎int from myList通过int构造函数隐式转换为Foo实例,然后绑定到引用变量c.但是这个对象住在哪里?如果它是暂时的,为什么它在下一行仍然有效?
似乎int from
myList通过int构造函数隐式转换为Foo实例,然后绑定到引用变量c.
是的,这正是发生的事情.
但是这个对象住在哪里?
未指定,但它必须表现得像一个与引用具有相同范围的自动变量,因此可能在堆栈上就像一个自动变量.
如果它是暂时的,为什么它在下一行仍然有效?
因为如果用于初始化const引用,则不明确的规则会导致临时的生命周期延长.它的寿命延长到与参考相匹配.