IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

std::is_constructible : Resultat variable entre Clang, GCC et MSVC


Sujet :

C++

  1. #1
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut std::is_constructible : Resultat variable entre Clang, GCC et MSVC
    Hello ,

    J'aimerais avoir votre avis sur ce problème:
    https://godbolt.org/z/dsra6d7vh

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct A{
        int a;
    };
    static_assert(std::is_constructible_v<A, int>); // Clang assert alors que je peux construire.
    
    int main(){
       A obj{10};
       return obj.a;
    }
    
    Ça passe sous MSVC et GCC mais pas clang. Alors je soupçonne un bug de libcxx la dessus non?
    Ou alors il y a un flag que j'ignore sous Clang ?
    Avis au sénior bien sûr

    Merci
    Homer J. Simpson


  2. #2
    Membre actif Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Points : 245
    Points
    245
    Par défaut
    Pour aider certains:
    Sur clang il se peut que std::is_constructible_v ne soit pas défini.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static_assert(std::is_constructible<A, int>::value)
    Mais oui il y a bien l’erreur:


    Je pense que c’est ta version de GCC qui n’est pas suffisamment récente. Car avec la version «trunk» l’assertion est levée.

    https://godbolt.org/z/KMeM9jxe1

    A noter que sans le Int sa compile, mais je ne pense pas que ça va t’aider.


    Si cela peut aider:
    https://stackoverflow.com/questions/...trait-of-the-p

    Mais comme toi je ne vois pas pourquoi l’assertion est levée.
    "Quand le monde est dangereux, l'humilité est un facteur de longévité." ( Baxter "Evolution" )

  3. #3
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Bon je vais prendre le temps de répondre parce que je suis gentil.
    Citation Envoyé par Suryavarman Voir le message
    Pour aider certains:
    Sur clang il se peut que std::is_constructible_v ne soit pas défini.
    std::is_constructible_v date de C++17 donc dans mon exemple si.


    Citation Envoyé par Suryavarman Voir le message
    Je pense que c’est ta version de GCC qui n’est pas suffisamment récente. Car avec la version «trunk» l’assertion est levée.
    Encore une fois, je suis en C++20 pas 17.

    Citation Envoyé par Suryavarman Voir le message
    A noter que sans le Int sa compile, mais je ne pense pas que ça va t’aider.
    Sans doute mais tu ne teste dans ce cas, pas du tout la même chose.

    Merci d'arrêter avec les liens stackoverflow...
    Homer J. Simpson


  4. #4
    Membre actif Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Points : 245
    Points
    245
    Par défaut
    Effectivement j’ai rien dit sur c++20 sur gcc sa passe.
    https://godbolt.org/z/3j81G8dzq

    Je n’avais pas fait attention à la version de c++. Et je n’avais pas vue ton lien vers godbolt.org.
    "Quand le monde est dangereux, l'humilité est un facteur de longévité." ( Baxter "Evolution" )

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Bonjour,

    En C++17, je dirais que le is_constructible<> doit échouer. Un agrégat ne pouvait pas être initialisé par A obj(10);.

    En C++20, il devrait réussir donc Clang indiquerait quelque chose d'erroné. Comme il reste encore quelques "rares" capacités du C++20 qui ne sont pas dans tous les compilateurs. Si on regarde l'état d'implémentation du C++20 pour Clang à la section "Parenthesized initialization of aggregates" aujourd'hui, on y voit "No". Donc en effet en Clang actuel is_constructible<> doit ici échouer.

    En C++17 comme en C++20, A obj{10}; est valide, mais ça n'est pas ce que doit indiquer le is_constructible<>.

  6. #6
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    En C++17, je dirais que le is_constructible<> doit échouer. Un agrégat ne pouvait pas être initialisé par A obj(10);.

    En C++20, il devrait réussir donc Clang indiquerait quelque chose d'erroné. Comme il reste encore quelques "rares" capacités du C++20 qui ne sont pas dans tous les compilateurs. Si on regarde l'état d'implémentation du C++20 pour Clang à la section "Parenthesized initialization of aggregates" aujourd'hui, on y voit "No". Donc en effet en Clang actuel is_constructible<> doit ici échouer.

    En C++17 comme en C++20, A obj{10}; est valide, mais ça n'est pas ce que doit indiquer le is_constructible<>.
    Ah bas merci, je cherchais justement le nom de la feature!
    C'est bien ce que je pensais, Clang n'a pas encore tout supporté.

    Je te remercie!
    Homer J. Simpson


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de variable entre SQL et Php
    Par copin dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/06/2005, 10h58
  2. Partage d'une variable entre les processus fils
    Par Mehdi Feki dans le forum Linux
    Réponses: 7
    Dernier message: 09/01/2005, 13h34
  3. [langage] Probleme passage de variables entre modules
    Par Ludo167 dans le forum Langage
    Réponses: 4
    Dernier message: 13/08/2004, 12h25
  4. [recuperation de variable entre 2 jsp]
    Par maya5 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 02/06/2004, 13h23
  5. Types de variables entre mysql/php et flash
    Par ramses83 dans le forum Flash
    Réponses: 2
    Dernier message: 06/10/2003, 18h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo