29 votes

<std::is_constructible sur les types incomplets

J'ai le code suivant :

#include 

class A;

int main()
{
    std::cout << std::is_constructible::value << std::endl;
}

Lorsque j'utilise GCC 8.3, ce code compile. Cependant, lorsque j'utilise Clang 8.0, j'obtiens une erreur de compilation indiquant que les types incomplets ne peuvent pas être utilisés dans les traits de type.

Lequel est correct ? Ai-je le droit d'utiliser is_constructible sur un type incomplet (avec une valeur attendue de false), ou ne suis-je pas autorisé à le faire ?

25voto

StoryTeller Points 6139

Le comportement est indéfini.

[meta.unary.prop]

template  struct is_constructible;

T et tous les types dans le groupe de paramètres Args doivent être des types complets, du type void (peut-être qualifiés en const ou en volatile), ou des tableaux de taille inconnue.

C'est une condition préalable de la méta-fonction. Un contrat que votre code viole. libc++ est généreux en vous en notifiant.


Notez que mettre cette condition préalable là et laisser le reste indéfini a une raison. Un programme où deux points d'instanciation d'un modèle ont des significations différentes est mal formé NDR. La seule action sensée est d'exiger des types complets. Et après tout, c'est quand le trait est le plus utile de toute façon.

17voto

Nellie Danielyan Points 941

Votre code entraîne un comportement indéfini.

Cppreference indique :

template< class T, class... Args > struct is_constructible;

T et tous les types dans le pack de paramètres Args doivent être un type complet, (éventuellement qualifié cv) void, ou un tableau de taille inconnue. Sinon, le comportement est indéfini.

8voto

NathanOliver Points 10062

Votre code a un comportement indéfini. Selon le tableau 47 [meta.unary.prop], std::is_constructible nécessite

T et tous les types dans le pack de paramètres du modèle Args doivent être des types complets, des types const-volatile void, ou des tableaux de taille inconnue.

mise en emphase de ma part

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