Where is the definition of `top-level cv-qualifiers` in the C++11 Standard?

前端 未结 3 2129
自闭症患者
自闭症患者 2020-12-08 11:29

In the draft C++11 standard: N3337 I found several references to top-level cv-qualifiers, but no definition.

相关标签:
3条回答
  • 2020-12-08 12:30

    From Dan Saks's Top-Level cv-Qualifiers in Function Parameters:

    In C++, a cv-qualifier that applies to the first level of a type is called a toplevel cv-qualifier. For example, in:

    T *const p;
    

    the top-level cv-qualifier is const, and in:

    T const *volatile q;
    

    the top-level cv-qualifier is volatile. On the other hand:

    T const volatile *q;
    

    has no top-level cv-qualifiers. In this case, the cv-qualifiers const and volatile appear at the second level.

    The signature of a function includes all cv-qualifiers appearing in that function’s parameter types, except for those qualifiers appearing at the top-level of a parameter type.

    For example, in:

    int f(char const *p);
    

    the const qualifier is not at the top level in the parameter declaration, so it is part of the function’s signature.

    On the other hand, in:

    int f(char *const p);
    

    the const qualifier is at the top level, so it is not part of the function’s signature. This function has the same signature as:

    int f(char *p);
    

    I couldn't find a definition in the standard either but what I posted above is explicitly stated in N3337 §8.3.5-5

    After producing the list of parameter types, any top-level cv-qualifiers modifying a parameter type are deleted when forming the function type.


    Edit: At the time of writing the above post a definition in the standard could not be found but now there's one as pointed out by Shafik:

    n4296 excerpt:

    In this International Standard, the notation cv (or cv1 , cv2 , etc.), used in the description of types, represents an arbitrary set of cv-qualifiers, i.e., one of {const}, {volatile}, {const, volatile}, or the empty set. For a type cv T, the top-level cv-qualifiers of that type are those denoted by cv. [Example: The type corresponding to the type-id const int& has no top-level cv-qualifiers. The type corresponding to the typeid volatile int * const has the top-level cv-qualifier const. For a class type C, the type corresponding to the type-id void (C::* volatile)(int) const has the top-level cv-qualifier volatile. — end example ]

    0 讨论(0)
  • 2020-12-08 12:34

    This question is the subject of defect report 609: What is a “top-level” cv-qualifier? which says:

    The phrase “top-level cv-qualifier” is used numerous times in the Standard, but it is not defined. The phrase could be misunderstood to indicate that the const in something like const T& is at the “top level,” because where it appears is the highest level at which it is permitted: T& const is ill-formed.

    and the proposed resolution suggests adding the following wording and note:

    For a type cv T, the top-level cv-qualifiers of that type are those denoted by cv. [Example: The type corresponding to the type-id “const int&” has no top-level cv-qualifiers. The type corresponding to the type-id “volatile int * const” has the top-level cv-qualifier const. For a class type C, the type corresponding to the type-id “void (C::* volatile)(int) const” has the top-level cv-qualifier volatile. —end example]

    Update

    The defect has changed status to DRWP which means it is now part of the latest draft standard and we can find the new wording in N4527.

    0 讨论(0)
  • 2020-12-08 12:34

    I only found one instance of the phrase in the standard, and that was in a non-normative note. Lacking any other definition, one must assume that the expression is interpreted as it would be normally in English; that the qualifier is at the highest level of the type declaration. Of course, we generally write the declarations (in plain text, not in C++) from left to right, not from up to down, but the usual rules apply: left comes before right, and up comes before down. So for something like char *const p, we would write it (in English): "p is a const pointer to char". (In this case, English is the exact opposite of the order we would use in C++. This isn't always the case, however.) Since the const modifies pointer, which is the left most (top) element, it is a top level qualifier.

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