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

时间:2014-11-25 16:02:07

标签: c++ reference

此代码在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。但是这个对象住在哪里?如果它是暂时的,为什么它在下一行仍然有效?

3 个答案:

答案 0 :(得分:5)

  

似乎来自myList的int通过int构造函数隐式转换为Foo实例,然后绑定到引用变量c

是的,这正是发生的事情。

  

但这个对象住在哪里?

未指定,但它必须表现得像一个与引用具有相同作用域的自动变量,所以可能在堆栈上就像一个自动变量。

  

如果它是暂时的,为什么它在下一行仍然有效?

因为如果用于初始化const引用,则隐藏规则会导致临时的生命周期延长。它的生命周期延长到与参考相匹配。

答案 1 :(得分:3)

这里临时对象的生命周期在初始化引用时被扩展。

来自标准

§12.2/ 4

  

有两种情况下,临时状态被摧毁   不同点比完全表达结束。第一个背景   是表达式作为声明符的初始值设定项出现的情况   定义一个对象。 [...]

§12.2/ 5

  

第二个上下文是指 引用绑定到临时 。[...]

答案 2 :(得分:1)

临时返回(int将被转换为Foo)绑定到引用c。这意味着临时的生命时间延长到c的生命时间。