代码之家  ›  专栏  ›  技术社区  ›  user42768

C++将引用成员绑定到构造函数参数

  •  1
  • user42768  · 技术社区  · 7 年前

    https://wandbox.org/ ,带有“g++prog.cc-Wall-Wextra-std=c++1z”):

    #include <iostream>
    
    class B{
    public:
        B(): copy(false){ std::cout << "B-constructed" << std::endl;}
        B(const B& b): copy(true){ std::cout << "B-copy-constructed" << std::endl; }
        ~B(){ std::cout << (copy?"B-destructed":"B-(copy)-destructed") << std::endl;}
    
        bool copy;
    };
    
    class A{
    public:
        A(B b): bref(b){std::cout << "A-constructed" << std::endl;}
        ~A() {std::cout << "A-destructed" << std::endl;}
        B &bref;
    };
    
    
    void f(){
        B b;
        A a(b);
    
        std::cout << "f over" << std::endl;
    }
    
    int main()
    {
        f();
    
        std::cout << "main over" << std::endl;
        return 0;
    }
    

    产生以下输出:

    B-constructed
    B-copy-constructed
    A-constructed
    B-destructed
    f over
    A-destructed
    B-(copy)-destructed
    main over
    

    物体破坏的顺序似乎不同寻常。这就好像构造函数参数的生存期被延长了一样。该标准是否提到将成员引用绑定到构造函数参数?

    绑定到mem初始值设定项中引用成员的临时表达式格式错误。[示例:

    结构A{

    A():v(42){}//错误

    常量int&v

    };

    1 回复  |  直到 4 年前
        1
  •  1
  •   gsamaras    7 年前

    您的析构函数有一个逻辑错误,因为您打印的副本在 copy 是错误的。

    更改此项:

    ~B(){ std::cout << (copy?"B-destructed":"B-(copy)-destructed") << std::endl;}
    

    为此:

    ~B(){ std::cout << (copy?"B-(copy)-destructed":"B-destructed") << std::endl;}
    

    现在输出:

    B-constructed
    B-copy-constructed
    A-constructed
    B-(copy)-destructed
    f over
    A-destructed
    B-destructed
    main over
    

    Order of member constructor and destructor calls ).


    该标准是否提到将成员引用绑定到构造函数参数?

    对象将占用的存储已分配,或在 对象的生存期已结束,在 可以使用原始对象,但只能以有限的方式使用。对于对象 ([basic.stc.dynamic.deallocation]),并使用 不依赖于其值的glvalue定义良好。

    Source