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 :

[C++0x] Impossible d'initialiser des tuples avec l'initialisation par accolade ?


Sujet :

C++

  1. #1
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut [C++0x] Impossible d'initialiser des tuples avec l'initialisation par accolade ?
    Bonjour !
    J'explore en ce moment les nouvelles possibilités du C++0x, comme par exemple l'initialisation par accolade (Et je pose un copyright sur cette expression car c'est la première fois que je la vois traduite en français ) Avec GCC snapshot du 20100310, l'initialisation par accolade© de std::pair est possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::pair<int, double> p = {4, 5.0}; // OK!
    Mais par pour les std::tuple !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::tuple<int, double> t = {4, 5.0}; // Ne compile pas.
    error: converting to 'std::tuple<int, double>' from initializer list would use explicit constructor 'std::tuple<_T1, _T2>::tuple(_U1&&, _U2&&)
    [with _U1 = int, _U2 = double, _T1 = int, _T2 = double]'|
    C'est vrai que dans le draft 3035, les différents constructeurs de std::pair ne sont pas marqué explicit alors que les deux constructeurs de std::tuple le sont.
    Mais je ne comprends en fait pas bien quel est le rôle d'explicit dans l'échec de la compilation dans ce cas.

    Des idées ?

  2. #2
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Je ne sais pas trop...

    Ceci compile, non ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::tuple<int, double> t {4, 5.0}; // pas de =
    edit: oui ça fonctionne

  3. #3
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Oui, cette syntaxe-là fonctionne, car elle est strictement équivalente à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::tuple<int, char, double> t(0, 'a', 0.0);
    On peut aussi initialiser un tuple en lui affectant un tuple temporaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::tuple<int, char, double> t = std::tuple<int, char, double>(0, 'a', 0.0);
    Ce n'est vraiment que lorsqu'on essaye d'initialiser un tuple en lui affectant une liste en {} que ça ne fonctionne pas.
    C'est dommage, ça aurait permis quelques raccourcis syntaxiques sympathiques, comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    std::tuple<int, char, double> foo(std::tuple<int, char, double> t)
    {
        //... do something
        return {4, 'b', 6.0};
     }
     
    int main()
    {
        int i = 0;
        char s = 'a';
        double d = 3.14;
     
        std::tuple<int, char, double> t = foo({i, s, d});
    }

Discussions similaires

  1. Impossible d'envoyer des mails avec postfix
    Par rutabagas dans le forum Réseau
    Réponses: 8
    Dernier message: 09/02/2009, 09h32
  2. initialisation des variable avec une boucle
    Par grospatapouf dans le forum Langage
    Réponses: 10
    Dernier message: 10/01/2009, 12h17
  3. [Configuration] Impossible de passer des arguments avec require
    Par black is beautiful dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 06/10/2007, 21h58
  4. [EasyPHP] impossible de faire des URLS avec variable
    Par SandraG dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 9
    Dernier message: 30/03/2006, 17h38
  5. Réponses: 2
    Dernier message: 21/07/2005, 14h20

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