Can I call a copy constructor explicitly?

前端 未结 6 1511
名媛妹妹
名媛妹妹 2021-02-02 12:50

I\'m a little confused as to the mechanics of the copy constructor. Correct me if I\'m wrong:

If a method takes a reference to an object as a parameter, and the class d

6条回答
  •  陌清茗
    陌清茗 (楼主)
    2021-02-02 13:04

    The fact that you are making a method call is of no importance here. Reference parameter initialization during a function call is no different from a standalone reference initialization and is governed by the same rules.

    The rules of reference initialization are a bit complicated, but the bottom line is that if the initializer is an lvalue (the argument in the method call in your case) and the type of the reference is the same as the type of the initializer (i.e. type of the parameter is the same as the argument type), then the reference will be bound directly. I.e. no copy is created.

    Object a; // class type
    Object &r = a; // no copying
    const Object &cr = a; // no copying
    

    If these requirements are not met (like if the initializer is an rvalue, for example), then it all depends. In some cases the copying might and will take place. For example

    const Object &tr = Object();
    

    can be interpreted by the compiler as

    const Object &tr = Object(Object(Object(Object())));
    

    with implementation-dependent finite number of copyings. Of course, for efficiency reasons compilers normally are trying not to create unnecessary copies, even when they are allowed to copy.

    A classic example that often stirs debate about the validity of the copying behavior of the compiler is the reference initialization in expressions like the following one

    Object a;
    const Object &r =  ? a : Object();
    

    A person familiar with C++ reference semantics would understand that expressions like the above are likely the rationale behind the standard permission to perform superfluous copying during reference initialization.

提交回复
热议问题