Is a glvalue integral constant expression a constant expression?

后端 未结 1 535
死守一世寂寞
死守一世寂寞 2021-01-20 03:17

N4527 5.20 [expr.const]p3

An integral constant expression is an expression of integral or unscoped enumeration type, implici

1条回答
  •  时光取名叫无心
    2021-01-20 03:32

    Is a an integral constant expression?

    In the following contexts:

    int b[a]{};
    static_assert(a,"");
    switch(1){
      case a:
        ;
    }
    

    yes, a is an integral constant expression. Starting with your first quote:

    An integral constant expression is an expression of integral or unscoped enumeration type, implicitly converted to a prvalue, where the converted expression is a core constant expression.

    'a' is an integral type, in your cases it will be implicitly converted to a prvalue, so now is a a core constant expression? Yes, if we go back to paragraph 2 which defines what is not a core constant expression:

    A conditional-expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine (1.9), would evaluate one of the following expressions

    it has the following clause:

    an lvalue-to-rvalue conversion (4.1) unless it is applied to

    with the following exception:

    a non-volatile glvalue of integral or enumeration type that refers to a complete non-volatile const object with a preceding initialization, initialized with a constant expression, or

    which applies to a since it is non-volatile, const and is initialized with a constant expression.


    Is a a constant expression?

    In the same contexts as above, yes, since we can see from the quote above it is a core constant expression.


    Is a glvalue integral constant expression a constant expression?

    No, in order for it to be a integral constant expression it must be converted to a prvalue and threfore can not be a glvalue.

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