2017-01-14 3 views
0

siehe Code unten, f() ist unten definiert Hauptfunktion wird als schlecht geformt betrachtet? könnte mir jemand eine Erklärung dafür geben?constexpr-Funktion muss vorwärts definiert werden?

constexpr int f(); 
void indirection(); 
int main() { 
    constexpr int n = f(); // ill-formed, `int f()` is not yet defined 
    indirection(); 
} 
constexpr int f() { 
    return 0; 
} 
void indirection() { 
    constexpr int n = f(); // ok 
} 

Antwort

2

Der C++ 14-Standard bietet das folgende Codefragment (von mir die Bequemlichkeit halber verkürzt):

constexpr void square(int &x); // OK: declaration 

struct pixel { 
    int x; 
    int y; 
    constexpr pixel(int); 
}; 

constexpr pixel::pixel(int a) 
    : x(a), y(x) 
{ square(x); } 

constexpr pixel small(2); // error: square not defined, so small(2) 
         // is not constant so constexpr not satisfied 

constexpr void square(int &x) { // OK: definition 
    x *= x; 
} 

Die Lösung ist die Definition von square über den die Erklärung der small zu bewegen.

Aus dem obig wir zu dem Schluss kommen können, dass es in Ordnung constexpr Funktionen zu übermitteln erklären, aber ihre Definitionen müssen vor zu ihrem ersten Einsatz zur Verfügung steht.

2

A constexpr etwas hat bei der Kompilierung bekannt sein, an jedem Punkt, wo es verwendet wird.

Dies ist im Wesentlichen das Gleiche wie Sie eine Variable eines unvollständigen Typs nicht deklarieren können, auch wenn dieser Typ später in der gleichen Quelle vollständig definiert ist.