Rule of reordering member declaration in class

前端 未结 1 1415
野趣味
野趣味 2021-02-04 04:57

I\'m reading the c++14 N3797 and I\'ve encountered with 3.3.7/1:

If reordering member declarations in a class yields an alternate valid program under (1

相关标签:
1条回答
  • 2021-02-04 05:42

    The "alternate valid program" is referring to a situation in which each ordering of the elements in the class yields a valid interpretation of the program, but the meaning changes depending on the ordering.

    In your case, changing the order of a and b is allowed, but since their relative order can't affect the meaning of the program, the behavior is defined.

    For this to happen, you must use a name in the class that has already been defined with some other meaning outside the class. For example:

    typedef void *T;
    
    struct whatever {
        T a;
        typedef long T;
    };
    

    Here, the relative order of the declaration of a and the typedef of T affects the meaning of the code. As it's written right now, a has type void *, because the global typedef void *T; is in scope when the T a; is parsed.

    If, however, we rearranged the two so as:

    typedef void *T;
    
    struct whatever {
        typedef long T;
        T a;
    };
    

    ...the T a; is equivalent to long a;. The meaning of the program is different due to the relative ordering of the two declarations, so the behavior is undefined.

    0 讨论(0)
提交回复
热议问题