constexpr function parameters as template arguments

前端 未结 4 1132
谎友^
谎友^ 2020-11-30 07:43

I am playing around with some toy code using c++11 to figure out a bit more about how things work. During this I came across the following issue that simplifies down to:

4条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-30 08:02

    Function parameters of a constexpr function aren't constant expressions. The function is constexpr to the outside (as calling it might result in a constant expression), but calculations inside are just as constexpr as they would be in a normal function.

    Template-arguments require constant expressions. These are the crucial requirements for constant expressions that aren't met in your code and thus produce the compiler error ([expr.const]/2, emphasis mine):

    A conditional-expression is a core constant expression unless it involves one of the following as a potentially evaluated subexpression (3.2) […]:

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

    • a glvalue of integral or enumeration type that refers to a non-volatile const object with a preceding initialization, initialized with a constant expression, or
    • a glvalue of literal type that refers to a non-volatile object defined with constexpr, or that refers to a sub-object of such an object, or
    • a glvalue of literal type that refers to a non-volatile temporary object whose lifetime has not ended, initialized with a constant expression;

    You are applying an lvalue-to-rvalue conversion on the parameters to pass them as template arguments.
    The first bullet item doesn't apply as the function parameter is neither precedingly initialized nor known to be initialized with a constant expression, and the second and third don't either (in particular, function parameters shall not be declared constexpr).

提交回复
热议问题