2013-08-29 27 views
35

Tak, zabawy z constexpr, MSVC (Visual Studio 2012) dał mi błąd podczas próby zakwalifikowania mojej funkcji ze słowem kluczowym constexpr przy użyciu tego prostego programu (zawiera pominięta):Dlaczego MSVC++ 11 odrzuca kwalifikację constexpr funkcji?

constexpr int factorial(int n) 
{ 
    return n <= 1 ? 1 : (n * factorial(n-1)); 
} 

int main(void) 
{ 
    const int fact_three = factorial(3); 
    std::cout << fact_three << std::endl; 
    return 0; 
} 

constexpr zostało podkreślone na czerwono z następujący komunikat:

błąd: deklaracja ta ma klasę przechowywania lub wpisz specyfikator

i próbuje skompilować Progr podałem następującą wartość:

1> main.cpp (5): błąd C2144: błąd składni: "int" powinno być poprzedzone ";"

1> main.cpp (5): błąd C4430: brak specyfikatora typu - int przyjęto. Uwaga: C++ nie obsługuje domyślnego-int

To naprawdę mnie zastanawia, ponieważ jest to bardzo dobry przykład Cppreference uses to illustrate the use of constexpr. Najpierw użyłem prostej funkcji, która zwróciła literał, tj. constexpr int func(){return 5;}, ale która spowodowała ten sam błąd. Pierwszą wiadomość zinterpretowałem jako "powinna być funkcją członka struktury lub klasy", ale przykład z Cppreference pokazuje, że nie jest to konieczne.

Więc, czego oczywiście brakuje tutaj?

Odpowiedz

37

Po prostu - ponieważ Visual Studio nie obsługuje constexpr (przed Visual Studio 2015).

Należy pamiętać, że MSVC++ 11 to Visual Studio 2012; VC++ 10 to Visual Studio 2010.

+0

Och, nie myślałem o tym ... Dzięki za wskazanie tego! Zatrzymam ten link i zaakceptuję go jak najszybciej. Nie rozumiem jednak, co się stało ... – JBL

+0

Myślę, że jest to rozsądne pytanie zawierające kod, który nie działał, czego oczekiwałeś i jaki błąd się pojawił. – jcoder

+0

Zgadzam się, pytanie jest w porządku. Właściwie to po prostu pójdę i zabiorę się za to. – Chowlett

Powiązane problemy