How can I change the variable to which a C++ reference refers?

前端 未结 10 1032
既然无缘
既然无缘 2020-11-29 01:50

If I have this:

int a = 2;
int b = 4;
int &ref = a;

How can I make ref refer to b after this code?

10条回答
  •  死守一世寂寞
    2020-11-29 02:08

    It is impossible, as other answers state.

    However, if you store your reference in a class or struct, you could re-create the whole thing using placement new, so the reference is re-bound. As @HolyBlackCat noted, don't forget to use std::launder to access the re-created object or use the pointer returned from the placement new. Consider my example:

    #include 
    
    struct A {
        A(int& ref) : ref(ref) {}
        // A reference stored as a field
        int& ref;    
    };
    
    int main() {
      int a = 42;
      int b = 43;
    
      // When instance is created, the reference is bound to a
      A ref_container(a);
      std::cout << 
        "&ref_container.ref = " << &ref_container.ref << std::endl <<
        "&a = " << &a << std::endl << std::endl;
    
      // Re-create the instance, and bind the reference to b
      A* new_ref_container = new(&ref_container) A(b);
      std::cout <<
        // &ref_container and new_ref_container are the same pointers
        "&ref_container = " << &ref_container << std::endl <<
        "new_ref_container = " << new_ref_container << std::endl <<
        "&new_ref_container.ref = " << &new_ref_container->ref << std::endl <<
        "&b = " << &b << std::endl << std::endl;
    
      return 0;
    }
    

    demo

    The output is:

    &ref_container.ref = 0x7ffdcb5f8c44
    &a = 0x7ffdcb5f8c44
    
    &ref_container = 0x7ffdcb5f8c38
    new_ref_container = 0x7ffdcb5f8c38
    &new_ref_container.ref = 0x7ffdcb5f8c40
    &b = 0x7ffdcb5f8c40
    

提交回复
热议问题