Perché questa funzione membro constexpr
static
, identificata dal commento //! Nah
, non viene visualizzata come constexpr
quando viene chiamata?Perché questa funzione membro statico di constexpr non è vista come constexpr quando viene chiamata?
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 rapporti
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 rapporti
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'
mio editor di testo insiste sul fatto che il nome nella chiamata è lo stesso del nome nella definizione della funzione.
Sembra avere qualcosa a che fare con la classe incompleta, perché con OUT_OF_CLASS
ha definito la compilazione gradevole.
Ma allora perché funzionano i dati n_items_
e, perché tale regola (non ha senso per me)?
gcc6.1 e clang3.8 non mi piace. –
Nota, spostando la dichiarazione e inizializzazione di 'bah' fuori da' struct' e facendo 'static constexpr int bah = Item_id :: static_n_items();' rende questo compilato su G ++ 5.3 –
@GillBates: Grazie, ho trovato lo stesso (vedi la domanda rivista). È strano. –