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

C++ 为什么我可以将int绑定到具有int构造函数的类的引用?,c++,reference,C++,Reference,这段代码在VS2013和Ideone.com()中都编译得很好: #包括 #包括 #包括 福班 { 公众: Foo(intx_=-1):x(x_),y(-2.3f){} int x; 浮动y; }; int main() { std::列表myList; myList.push_back(0); for(auto-it=std::begin(myList);it!=std::end(myList);+it) { Foo const&c=*it; 标准::cout 似乎myList中的int通过i

这段代码在VS2013和Ideone.com()中都编译得很好:

#包括
#包括
#包括
福班
{
公众:
Foo(intx_=-1):x(x_),y(-2.3f){}
int x;
浮动y;
};
int main()
{
std::列表myList;
myList.push_back(0);
for(auto-it=std::begin(myList);it!=std::end(myList);+it)
{
Foo const&c=*it;
标准::cout
似乎myList中的int通过int构造函数隐式转换为Foo实例,然后将其绑定到引用变量
c

是的,事情就是这样

但是这个物体住在哪里

未指定,但它的行为必须类似于自动变量,与引用的作用域相同,因此在堆栈上可能与自动变量一样

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

因为如果使用模糊规则初始化
const
引用,则会延长临时规则的生存期。它的生存期会延长以匹配引用

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

是的,事情就是这样

但是这个物体住在哪里

未指定,但它的行为必须类似于自动变量,与引用的作用域相同,因此在堆栈上可能与自动变量一样

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


因为如果使用模糊规则初始化
常量
引用,它会导致临时变量的生存期延长。它的生存期会延长以匹配引用。

返回的临时变量(int将转换为Foo)绑定到参考c。这意味着临时文件的使用寿命将延长到c的使用寿命。

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

这里,临时对象的生存时间将在初始化引用时延长

标准

§12.2/4

有两种情况下,临时机构会在同一时间被销毁 与fullexpression结尾不同的点。第一个上下文 当表达式显示为声明符的初始值设定项时 定义对象。[…]

§12.2/5

第二个上下文是引用绑定到临时的[…]


在这里,临时对象的生存期随着其初始化引用而延长

标准

§12.2/4

有两种情况下,临时机构会在同一时间被销毁 与fullexpression结尾不同的点。第一个上下文 当表达式显示为声明符的初始值设定项时 定义对象。[…]

§12.2/5

第二个上下文是引用绑定到临时的[…]


为什么他们有这个功能?它似乎没有多大价值。@BWG:我不知道。如果你想引用一个基类型,
base const&b=Derived();
。但是你是对的,没有太多价值。为什么他们有这个功能?它似乎没有太多价值。@BWG:我不知道。如果你想引用一个基类型,
base const&b=Derived();
。但是你是对的,没有太多价值。
#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
    }
}