Why is this constexpr
static
member function, identified by the //! Nah
comment, not seen as constexpr
when called?
struct Item_id
{
enum Enum
{
size, position, attributes, window_rect, max_window_size, _
};
static constexpr int n_items_ = _; // OK
constexpr auto member_n_items() const -> int { return _; } // OK
static constexpr auto static_n_items() -> int { return _; } // OK
static constexpr int so_far = n_items_; // OK
#ifndef OUT_OF_CLASS
static constexpr int bah = static_n_items(); //! Nah.
#endif
};
constexpr auto n_ids() -> int { return Item_id().member_n_items(); } // OK
auto main() -> int
{
#ifdef OUT_OF_CLASS
static constexpr int bah = Item_id::static_n_items(); // OK
#endif
}
MinGW g++ 5.1 reports
constexpr.cpp:12:46: error: 'static constexpr int Item_id::static_n_items()' called in a constant expression static constexpr int bah = static_n_items(); //! Nah.
Visual C++ 2015 reports
constexpr.cpp(12): error C2131: expression did not evaluate to a constant constexpr.cpp(12): note: failure was caused by call of undefined function or one not declared 'constexpr' constexpr.cpp(12): note: see usage of 'Item_id::static_n_items'
My text editor insists that the name in the call is the same as the name in the function definition.
It appears to have something to do with incomplete class, because with OUT_OF_CLASS
defined it compiles nicely.
But then why does the n_items_
data work, and, why such a rule (doesn't make sense to me)?
bah
out of thestruct
and doingstatic constexpr int bah = Item_id::static_n_items();
makes this compile on G++ 5.3 – Hatted Rooster