C++对象作为参数传递给其他对象的构造函数的顺序是什么?

C++对象作为参数传递给其他对象的构造函数的顺序是什么?,c++,scope,C++,Scope,当我用g++编译下面的代码时,C类的对象被构造时,A类的对象似乎没有被破坏,C类的对象构造函数访问B.ref_A引用时,B.ref_A引用也没有被破坏: #include <iostream> struct A { A(int aa) { a = aa; } ~A() { std::cout << "A out" << std::endl; } int a; };

当我用g++编译下面的代码时,C类的对象被构造时,A类的对象似乎没有被破坏,C类的对象构造函数访问B.ref_A引用时,B.ref_A引用也没有被破坏:

#include <iostream>

struct A
{
    A(int aa)
    {
        a = aa;
    }

    ~A()
    {
        std::cout << "A out" << std::endl;
    }

    int a;
};

struct B
{
    B(const A& a)
    : ref_a(a)
    {
    }

    ~B()
    {
        std::cout << "B out" << std::endl;
    }

    const A& ref_a;
};

struct C
{
    C(const B& b)
    {
        c = b.ref_a.a + 1;
    }

    int c;
};

int main(void)
{
    C c(B(A(1)));
    std::cout << c.c << std::endl;
}

<>但是,它是由C++语言保证的吗?

这里,当指令完成执行时,临时对象脱离范围。也就是说,就在C的构造函数返回之后


是的,这是由C++标准保证的。

< P>这里,当指令完成执行时,临时对象脱离范围。也就是说,就在C的构造函数返回之后


是的,这是由C++标准保证的。

@ QuaTaTu'Davy不介意,1984年的回答也是一个很好的例子:“QunTaTaI DeV不介意,1984年的回答也是一个很好的:对不起,我删除了我的答案,看来我完全错了。我希望叔叔们补充一个答案,因为我真的很困惑:我不认为这是一个允许的破坏顺序。在您的示例中,B应该在A之前而不是之后被销毁。原因是B的建造师在A的建造师之后完成,而破坏顺序总是与建造顺序相反。你使用什么编译器来销毁它?通过查看隐式构造函数B的函数调用,可以看出B的构造函数在A的构造函数之后完成。。。。临时A1是该函数调用的一个参数,函数参数的计算应该在函数调用实际完成之前完成。在函数输入之前有一个序列点。这明确地将构造顺序排列为A->B->C,因此销毁顺序必须是B->A,C在main的末尾被销毁。但所有这些,多个临时表都是按相反的顺序销毁的,在所有B临时表一起被反向销毁之后,所有A临时表一起被反向销毁。如果进行优化,通常只会看到创建了一个A对象和一个B对象。请注意,我的描述假设编译器可能会创建多个A临时对象。这是允许的:将临时文件绑定到常量引用可以在将常量引用绑定到最终临时文件之前复制临时文件。C++0x在将常量引用绑定到临时右值(此处)时不允许复制,并且总共只存在一个a、B和C对象。抱歉,我删除了我的答案,似乎我完全错了。我希望叔叔们补充一个答案,因为我真的很困惑:我不认为这是一个允许的破坏顺序。在您的示例中,B应该在A之前而不是之后被销毁。原因是B的建造师在A的建造师之后完成,而破坏顺序总是与建造顺序相反。你使用什么编译器来销毁它?通过查看隐式构造函数B的函数调用,可以看出B的构造函数在A的构造函数之后完成。。。。临时A1是该函数调用的一个参数,函数参数的计算应该在函数调用实际完成之前完成。在函数输入之前有一个序列点。这明确地将构造顺序排列为A->B->C,因此销毁顺序必须是B->A,C在main的末尾被销毁。但所有这些,多个临时表都是按相反的顺序销毁的,在所有B临时表一起被反向销毁之后,所有A临时表一起被反向销毁。如果进行优化,通常只会看到创建了一个A对象和一个B对象。请注意,我的描述假设编译器可能会创建多个A临时对象。这是允许的:将临时文件绑定到常量引用可以在将常量引用绑定到最终临时文件之前复制临时文件。C++0x不允许在将常量引用绑定到临时右值(此处)时进行复制,并且总共只存在一个a、B和C对象。