C++11 - Can't define constexpr literal using constexpr function?

前端 未结 2 773
孤街浪徒
孤街浪徒 2021-01-19 23:38

I\'ve run into what seems a counterintuitive error, namely, the inability to assign the value of a constexpr function to a constexpr literal (hope

相关标签:
2条回答
  • 2021-01-20 00:05

    In C++, inline definitions of member functions for a class are only parsed after the declaration of the class is complete.

    So even though the compiler "knows" about MyClass::FooValue(int), it hasn't "seen" its definition yet, and hence it can't be used in a constexpr expression.

    A general workaround for this is to stick to constexpr member functions, or declare constexpr constants outside the class.

    0 讨论(0)
  • 2021-01-20 00:08

    According to the standard, MyClass is considered an incomplete type when you try to invoke FooValue to initialize Foo5. Therefore, you cannot use its members as you did.
    The type is considered a completely-defined object type (or complete type) at the closing }.
    On the other side, the class is regarded as complete within function bodies. That's why Foo5Alt compiles just fine.
    See [class.mem]/6 for further details.

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