为什么我可以使用 int 构造函数将 int 绑定到类的引用



这段代码在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 的生命周期。

最新更新