2017-01-14 4 views
0

см. Код ниже, f() определяется ниже, основная функция считается плохо сформированной? Может ли кто-нибудь дать мне объяснение для этого?Функция constexpr должна быть определена вперед?

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 
} 

ответ

2

стандарт C++ 14 предоставляет следующий фрагмент кода (укороченный мной для удобства):

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; 
} 

Решение состоит в том, чтобы переместить определение square выше декларации small.

Из вышесказанного мы можем прийти к выводу о том, что направить функции constexpr, но их определения должны быть доступны до для их первого использования.

2

constexpr что-то должно быть известно во время компиляции, в каждой точке, где она используется.

Это по существу то же самое, что вы не можете объявить переменную неполного типа, даже если этот тип полностью определен позже в том же источнике.