38 votes

Pourquoi les déclarations de décomposition ne peuvent-elles pas être constexpr?

Considérons le fragment de code suivant pour tester la prochaine C++17 fonction de la décomposition des déclarations (anciennement connu sous le structurée liaisons)

#include <cassert>
#include <utility>

constexpr auto divmod(int n, int d)
{
    return std::make_pair(n / d, n % d); // in g++7, also just std::pair{n/d, n%d}
}

int main()
{
    constexpr auto [q, r] = divmod(10, 3);
    static_assert(q == 3 && r ==1);
}

Cette échoue sur les deux g++7-SVN et clang-4.0-SVN avec le message:

la décomposition de cette déclaration ne peut être déclaré constexpr'

- Déposer l' constexpr définition et le passage à un régulière assert() fonctionne sur les deux compilateurs.

Aucun des WG21 documents sur cette fonctionnalité mentionner l' constexpr mot-clé, ni en positif, ni négatif.

Question: pourquoi ne sont pas de décomposition déclarations d'être autorisés à l' constexpr? (en dehors de "parce que la Norme dit").

38voto

Jonathan Wakely Points 45593

Question: pourquoi ne sont pas de décomposition déclarations d'être autorisé à être constexpr? (en dehors de "parce que la Norme dit").

Il n'y a aucune autre raison. Que dit la norme dans [dcl.dcl] p8:

Le decl-spécificateur-seq doit contenir seulement le type de spécificateur auto (7.1.7.4) et cv-qualificatifs.

Cela signifie qu'il ne peut pas être déclarée avec constexpr.

Cela a été l'objet d'un Organe National de commentaire sur le C++17 CD, voir NOUS-95 dans P0488R0:

Commentaire: Il n'y a aucune raison évidente pour laquelle la décomposition les déclarations ne peuvent pas être déclarés comme statique, thread_local, ou constexpr.
Changement proposé: Permettre constexpr, statique, et thread_local à l' autorisées de spécificateurs de decl.

Commentaires 16 GO et GO 17 sont également liés.

Ces commentaires ont été rejetées pour C++17, après examen par l'Évolution du Groupe de Travail en Novembre 2016 réunion. Il était difficile de savoir ce que certaines classes de stockage signifierait un structurés déclaration contraignante, et exactement comment faire pour modifier le cahier des charges pour permettre l' constexpr (permettant simplement dans la grammaire ne dirais pas ce que cela signifie). Un papier à explorer l'espace de conception a été demandé. Il devrait être possible de changer à l'avenir sans casser le code, mais il n'y avait pas de temps pour le faire en C++17.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X