About binding a const reference to a sub-object of a temporary

后端 未结 3 747
迷失自我
迷失自我 2020-11-27 17:35

With code like

#include 

struct P2d {
    double x, y;
    P2d(double x, double y) : x(x), y(y) {}
    ~P2d() { printf("Destructor called         


        
3条回答
  •  醉梦人生
    2020-11-27 17:56

    Just read Columbo's answer.


    This is a gcc bug. The relevant rule is in [class.temporary]:

    There are two contexts in which temporaries are destroyed at a different point than the end of the full-expression. [...]

    The second context is when a reference is bound to a temporary. The temporary to which the reference is bound or the temporary that is the complete object of a subobject to which the reference is bound persists for the lifetime of the reference except:
    — A temporary object bound to a reference parameter in a function call (5.2.2) persists until the completion of the full-expression containing the call.
    — The lifetime of a temporary bound to the returned value in a function return statement (6.6.3) is not extended; the temporary is destroyed at the end of the full-expression in the return statement.
    — A temporary bound to a reference in a new-initializer (5.3.4) persists until the completion of the full-expression containing the new-initializer.

    We're binding a reference to a subobject of a temporary, so the temporary should persist for the lifetime of the reference. None of those three exceptions to this rule apply here.

提交回复
热议问题