Es wäre nützlich, "constexpr" -Parameter zu haben, um Compiler-bekannte Werte zu unterscheiden und so Fehler bei der Kompilierung zu erkennen. Beispiele:
%Vor%Was ist ein ungültiger Code für jetzt? Kann mir jemand erklären, warum das nicht umgesetzt werden kann?
BEARBEITEN:
Mit Hilfe von Templates sollten Benutzer sicherstellen, dass Literale immer als Template-Argumente und nicht als funktionale Argumente übergeben werden, was sehr unangenehm ist:
%Vor%Wenn ich verstehe, was Sie richtig machen wollen, ist die Funktionalität, die Sie anfordern, bereits verfügbar. Es ist nicht das eleganteste, aber ich denke, das ist gut genug.
Sie möchten eine Funktion zur Kompilierzeit und Laufzeit mit der gleichen Syntax aufrufen und wenn möglich zur Kompilierzeit auswerten, andernfalls sollte sie zur Laufzeit ausgewertet werden. Sie müssen Assertions für die Funktion unabhängig davon, wann sie aufgerufen wird, ausgewertet werden.
Ich glaube, dass dies tun wird, was Sie wollen:
%Vor%Der Trick besteht darin, bei der Kompilierung auf eine Weise fehlzuschlagen, die static_assert nicht benötigt, und die auch zur Laufzeit fehlschlägt.
Das klingt in der Theorie zwar großartig, aber in der realen Welt ist es nicht so nützlich. Die meisten Argumente für Funktionen sind keine Kompilierzeitkonstanten, und viele Einschränkungen sind auch zur Kompilierzeit nicht genau bekannt.
Eine solche Überladung zu spezifizieren und zu implementieren wäre eine erhebliche Menge an Arbeit, und sie würde nicht so viel verwendet werden. Wenn Sie über Begrenzungen und Argumente für die Kompilierungszeit verfügen, können Sie normalerweise die gesamte Funktion zum Zeitpunkt der Kompilierung auswerten, was bedeutet, dass eine Überladung nicht erforderlich ist.
Tags und Links c++ language-lawyer compile-time c++14