Ich bin mit etwas Spielzeug Code mit C++ 11 herumspielen, um ein bisschen mehr darüber herauszufinden, wie die Dinge funktionieren. Dabei stieß ich auf das folgende Problem, das zu vereinfacht unten:conexpr Funktion Parameter als Vorlage Argumente
template <int x, int y>
class add {
public:
static constexpr int ret = x + y;
};
constexpr int addFunc(const int x, const int y) {
return add<x,y>::ret;
}
int main() {
const int x = 1;
const int y = 2;
cout << add<x,y>::ret << endl; // Works
cout << addFunc(1,2) << endl; // Compiler error
return 0;
}
Ich bin mit GCC 4.8.1 und der Ausgang ist:
‚x‘ ist keine Konstante Ausdruck in Template-Argument für den Typ int‘ "
‚y‘ist kein konstanter Ausdruck in Template-Argument für Typ‚int‘
Was genau ist der Unterschied zwischen den beiden Arten ich versuche add::ret
zu berechnen? Diese beiden Werte sollten zum Zeitpunkt der Kompilierung verfügbar sein.
'conexpr'-Funktionen müssen zur Laufzeit ausgeführt werden können. – chris
Nun ... ja. Warum kann das nicht speziell zur Kompilierzeit ausgewertet werden? – Danny
Um zu erarbeiten: 'conexpr'-Funktionen müssen in der Lage sein, zur Laufzeit ausgeführt werden, und Ihre' constexpr'-Funktion würde fehlschlagen, wenn sie mit einem Wert aufgerufen wird, der keine Kompilierzeitkonstante ist, so dass Ihre 'constexpr'-Funktion nicht gültig ist . Was Sie suchen, ist nicht, was "constexpr" bietet, und ist auch nicht etwas, das C++ in einer anderen Form anbietet. Was am nächsten kommt, ist 'addFunc' eine Template-Funktion mit' int x' und 'int y' Template-Parametern. – hvd