39 votes

Initialisation de valeur C ++14 avec constructeur supprimé

J'ai une certaine incompréhension:

Laissez-la marque du constructeur par défaut de la struct Un comme supprimé:

struct A
{
  A() = delete;
};

La prochaine instruction est bien formé et qu'est-ce que l'effet?:

A a{};

De cppreference valeur initilization:

1) Si T est un type de classe sans constructeur par défaut ou avec un l'utilisateur par défaut fourni par le constructeur ou avec un supprimée par défaut constructeur de l'objet par défaut est initialisée.

mais alors l'effet d'initialisation par défaut est:

Si T est un type de classe, le constructeur par défaut est appelé à fournir à l' valeur initiale pour le nouvel objet.

Ou c'est agrégée d'initialisation? Merci!

30voto

Cicada Points 19550

Votre struct A est :

  • un type de classe qui a:
    • pas fourni par l'utilisateur constructeurs1,
    • aucune privés ou protégés non-membres de données statiques,
    • pas de classes de base,
    • aucun membre virtuel fonctions.

Par conséquent, il est considéré comme un type de regroupement, selon la définition prévue par le § 8.5.1/1.

Puis vient la priorité de l'ensemble de l'initialisation sur la valeur d'initialisation. La norme dit que les agrégats d'initialisation a priorité sur la valeur intialization (projet de N3936, § 8.5.4/3, page 201) (l'emphase est mienne)

Liste d'initialisation d'un objet ou d'une référence de type T est défini comme suit:

  • Si T est un agrégat, agrégée d'initialisation est effectuée (8.5.1).
  • Sinon, si l'initialiseur de liste n'a pas d'éléments et T est un type de classe avec un constructeur par défaut, l'objet est la valeur d'initialisation.
  • [... plus de règles...]

(1) Comme l'a demandé dans les commentaires sur les raisons de la suppression du constructeur ne compte pas comme défini par l'utilisateur, voici ce que dit la norme (projet de N3936, § 8.4.2/5, page 198):

Une fonction est fourni par l'utilisateur si elle est déclarée et non explicitement par défaut ou supprimé sur sa première déclaration.

20voto

juanchopanza Points 115680

S'il est bien formé. A est un agrégat1, et, selon le projet de N3936, un vide d'initialiseur de la liste utilisée en direct-initialisation de la liste de l'ensemble des résultats dans l'ensemble de l'initialisation:

De § 8.5.4/3 Liste d'initialisation [dcl.init.liste]:

Liste d'initialisation d'un objet ou d'une référence de type T est défini comme suit:

- Si T est un agrégat, agrégée d'initialisation est effectuée (8.5.1).

[ Exemple:

struct S2 { int m1; double m2, m3; };

....

S2 s23{}; // OK: default to 0,0,0

....

fin de l'exemple ]

....

Les changements pertinents entre le C++11 et C++1y sont un changement dans la priorité de l'ensemble vs valeur d'initialisation pour le cas des agrégats:

C++11 mène avec

Liste d'initialisation d'un objet ou d'une référence de type T est défini comme suit:

- Si l'initialiseur de liste n'a pas d'éléments et T est une classe type avec un constructeur par défaut, l'objet est la valeur d'initialisation.

- Sinon, si T est un agrégat, agrégée d'initialisation est effectuée (8.5.1)....

suivie par l'exemple ci-dessus.

C++1y donne la priorité à l'agrégation d'initialisation:

Liste d'initialisation d'un objet ou d'une référence de type T est défini comme suit:

- Si T est un agrégat, agrégée d'initialisation est effectuée (8.5.1).

....

- Sinon, si l'initialiseur de liste n'a pas d'éléments et T est un type de classe avec un constructeur par défaut, l'objet est la valeur d'initialisation.


1 Pourquoi est - A un agrégat?

C'est un ensemble à la fois en C++11 et C++14.

C++1y:

8.5.1 Agrégats [dcl.init.aggr]

Un agrégat est un tableau ou une classe (Clause 9) sans que l'utilisateur fourni par les constructeurs (12.1), aucun privés ou protégés non-membres de données statiques (Clause 11), pas de classes de base (article 10), et pas de fonctions virtuelles (10.3).

La seule partie qui n'est pas évidente est de savoir si le constructeur par défaut est fourni par l'utilisateur ou non. Il n'est pas:

Dans le § 8.4.2 [dcl.fct.def.par défaut]:

Une fonction est fourni par l'utilisateur si elle est déclarée et non explicitement par défaut ou supprimé sur sa première déclaration.

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