Question Pourquoi MSVC ++ 11 rejette-t-il la qualification constexpr d'une fonction?


Donc, jouer avec constexpr, MSVC (Visual Studio 2012) m'a donné une erreur en essayant de qualifier ma fonction avec le constexpr mot clé utilisant ce programme simple (inclut omis):

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 a été souligné en rouge avec le message suivant:

Erreur: cette déclaration n'a pas de classe de stockage ni de spécificateur de type

et en essayant de compiler le programme a donné la sortie suivante:

1> main.cpp (5): erreur C2144: erreur de syntaxe: 'int' doit être précédé de ';'

1> main.cpp (5): erreur C4430: spécificateur de type manquant - int supposé. Note: C ++ ne supporte pas default-int

Cela me dérange vraiment car c’est l’exemple même que Cppreference utilise pour illustrer l'utilisation de constexpr. Au début, j'ai utilisé une fonction simple qui renvoyait un littéral, c'est-à-dire constexpr int func(){return 5;}, mais qui a produit la même erreur. J'ai interprété le premier message comme "il devrait s'agir d'une fonction membre d'une structure ou d'une classe", mais l'exemple de Cppreference montre qu'il n'est apparemment pas nécessaire.

Alors, qu'est-ce que je manque de toute évidence ici?


37
2017-08-29 14:24


origine


Réponses:


Tout simplement parce que Visual Studio ne prend pas en charge constexpr (antérieur à Visual Studio 2015).

Notez que MSVC ++ 11 est Visual Studio 2012; VC ++ 10 est Visual Studio 2010.


38
2017-08-29 14:26