28 votes

Est nul {} légal ou non?

C'est un suivi de cette question.
Dans les commentaires et dans la réponse il est dit plus d'une fois qu' void{} est ni un type valide-id, ni une expression valide.

C'était bon, il avait du sens, et c'est tout.

Puis je suis venu à travers [7.1.7.4.1/2] (espace réservé type de déduction) du projet de texte.
Là, il est dit que:

[...]
- pour un non-jeté return instruction qui se produit dans une fonction déclarée avec un type de retour qui contient un espace réservé à un type, T est déclaré le type de retour et e est l'opérande de l' return déclaration. Si l' return instruction n'a pas d'opérande, puis e est void{};
[...]

Alors, est - void{} (conceptuellement) légal ou pas?
Si c'est acceptable comme mentionné dans le projet de travail (même si seulement comme un - comme si c'est un - déclaration), il doit être en effet juridique. Cela signifie qu' decltype(void{}) devrait être valable aussi bien, comme un exemple.
Sinon, en cas de travail le projet d'utilisation void() au lieu de void{}?


Eh bien, pour être honnête, je suis assez sûr que je ne suis pas assez habile pour faire remarquer une erreur dans le projet de travail, de sorte que la vraie question est: ce qui est faux dans mon raisonnement?
Quel est exactement l' void{} mentionné dans le paragraphe ci-dessus et pourquoi c'est une expression juridique dans ce cas?

11voto

AndyG Points 3298

Pour moi, ça sonne comme quelqu'un l'a foiré la fusion de la norme précédente avec la nouvelle.

Auparavant, la norme a dit: (C++14 N4140, 7.1.6.4.7 [dcl.spec.auto]):

Quand un [...] return déclaration se produit dans une fonction déclarée avec un type de retour qui contient un espace réservé à un type, le déduit le type de retour ou de type de variable est déterminée à partir du type de son initialiseur. Dans le cas d'un return sans opérande, l'initialiseur est considéré comme void().

La nouvelle norme permet l' if constexpr des déclarations, de sorte que la langue il faut changer pour refléter cela. if constexpr conduit à la notion de potentiellement jeté return déclaration (si l' return est dans le pas-pris d'une branche de constexpr si, ensuite, il est jeté et le type de retour est déduit à partir d'autres retour des déclarations, le cas échéant).

Probablement le nouveau libellé devrait être quelque chose comme:

pour un non-jeté de l'instruction return qui se produit dans une fonction déclarée avec un type de retour qui contient un espace réservé à un type, T est le a déclaré le type de retour et e est l'opérande de l' return déclaration. Si l'instruction return n'a pas d'opérande, puis T est auto et le déduit le type de retour est - void

10voto

skypjack Points 5516

Confirmé le bug. Déjà réparé.
Voici la discussion (assez courte pour être honnête).

Donc, la réponse est - non, void{} n'est pas légal .
C'était un bug de formulation du projet de travail.

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