In C ++ 11 constexpr-Funktionen ist eine zweite Anweisung wie eine assert()
nicht möglich. A static_assert()
ist in Ordnung, würde aber nicht funktionieren, wenn die Funktion als "normale" Funktion aufgerufen wird. Der Komma-Operator könnte kommen, um wrto zu helfen. Das assert()
ist aber hässlich und einige Tools spucken Warnungen darüber aus.
Betrachten Sie einen solchen "Getter", der neben der Behauptung durchaus verständlich ist. Aber ich möchte eine Art Zusicherung für die Laufzeit und die Kompilierungszeit behalten, kann aber nicht einfach überladen, abhängig vom Kontext 'constexpr'.
template<int Size>
struct Array {
int m_vals[Size];
constexpr const int& getElement( int idx ) const
{
ASSERT( idx < Size ); // a no-go for constexpr funcs in c++11
// not possible, even in constexpr calls as being pointed out, but what I would like:
static_assert( idx < Size, "out-of-bounds" );
return m_vals[idx];
}
};
Nebenbedingungen: C ++ 11, kein Heap, keine Ausnahmen, keine Compilerspezifikationen.
Beachten Sie, wie Kommentatoren betonten (danke!), static_assert
Das Argument ist nicht möglich (wäre aber nett). Der Compiler hat mir in dieser Situation einen anderen Fehler beim Zugriff außerhalb der Grenzen gemeldet.
static_assert
abhängig überhaupt nicht verwenden idx
. Sie können nur dann einen falschen Wert diagnostizieren, idx
wenn die Funktion in einem Kontext verwendet wird, der einen konstanten Ausdruck erfordert, indem Sie die Auswertung eines Konstrukts erzwingen, das es nicht zu einem konstanten Ausdruck macht. Außerhalb eines solchen Kontexts können Sie den Wert zur Kompilierungszeit niemals überprüfen.