Calling constexpr in default template argument

后端 未结 2 1710
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-04 01:40

In C++11 I am using a constexpr function as a default value for a template parameter - it looks like this:

template 
struct bar
{
    static         


        
2条回答
  •  爱一瞬间的悲伤
    2020-12-04 02:21

    I think GCC Clang is correct

    quoted from n3290:

    14.3.2 Template non-type arguments [temp.arg.nontype]

    1. A template-argument for a non-type, non-template template-parameter shall be one of:
      • for a non-type template-parameter of integral or enumeration type, a converted > constant expression (5.19) of the type of the template-parameter; or
      • ...

    EDIT: 5.19 3

    A literal constant expression is a prvalue core constant expression of literal type, but not pointer type. An integral constant expression is a literal constant expression of integral or unscoped enumeration type. [ Note: Such expressions may be used as array bounds (8.3.4, 5.3.4), as bit-field lengths (9.6), as enumerator initializers if the underlying type is not fixed (7.2), as null pointer constants (4.10), and as alignments (7.6.2). —end note ] A converted constant expression of type T is a literal constant expression, implicitly converted to type T, where the implicit conversion (if any) is permitted in a literal constant expression and the implicit conversion sequence contains only user-defined conversions, lvalue-to-rvalue conversions (4.1), integral promotions (4.5), and integral conversions (4.7) other than narrowing conversions (8.5.4).

    [ Note: such expressions may be used as case expressions (6.4.2), as enumerator initializers if the underlying type is fixed (7.2), and as integral or enumeration non-type template arguments (14.3). —end note ]

提交回复
热议问题