Partage
  • Partager sur Facebook
  • Partager sur Twitter

c++ modernes chaines de caractère avec type auto

Sujet résolu
    12 octobre 2019 à 18:33:49

    Bonjour je suis en train de suivre le cours c++ moderne sur le site "zeste de savoir" mais il y'a quelque chose qui me tracasse l'esprit, ils disent que pour utiliser le type "auto" dans une chaîne de caractère au lieux du "std::string" il faut mettre un s obligatoirement après le contenue de la variable . exemple :

    #include <iostream>
    #include <string>
    
    int main()
    {
    
       auto chaine{"du texte"s};
    
       std::cout << chaine;
    
    
       return 0;
    
    }


    or que mon code fonctionne très bien sans le "s" après ""du texte"" , j'aimerais comprendre pourquoi si quelqu'un peux m'aider.

    • Partager sur Facebook
    • Partager sur Twitter
      12 octobre 2019 à 19:12:58

      Bonjour Bernard,

      Et bien pour moi, ce sont 2 choses différentes, mais avec le même résultat apparent!

      auto chaine{"du texte"};

      dans ce cas chaine est un char *, c'est à dire un tableau de caractère (définition comme en C)

      alors que

      auto chaine{"du texte"s};

      dans ce cas chaine est un std::string, c'est à dire une chaine de caractères à la définition de la lib standart.

      Remarque, chez moi ton exemple ne compile pas! il me faut ajouté en haut du fichier main.cpp:

      using namespace std::string_literals;

      En effet le ".."s c'est de la lib standard, et il faut préciser au compilateur ce que ça veux dire.

      Bien cordialement.

      -
      Edité par Dedeun 12 octobre 2019 à 19:19:45

      • Partager sur Facebook
      • Partager sur Twitter
        12 octobre 2019 à 21:33:31

        C'est plus explicite avec un code d'exemple qui utilise des fonctionnalités de std::string. Par exemple :

        #include <iostream>
        #include <string>
        
        using namespace std::string_literals;
        
        int main()
        {
           auto const chaine{"du texte"s};
         
           std::cout << chaine.size() << std::endl;
           std::cout << chaine + " a lire"s << std::endl;
         
           return 0;
        }

        Essaies la meme chose sans le s et tu auras un bug a la ligne utilise size et un comportement etrange a la ligne suivante.

        Il ne faut surtout pas hesiter a signaler ce genre de choses aux auteurs pour qu'ils puissent corriger : https://zestedesavoir.com/forums/sujet/3703/la-programmation-en-c-moderne/ 

        • Partager sur Facebook
        • Partager sur Twitter
          13 octobre 2019 à 0:44:50

          merci de vos réponse, quand je rajoute un s à mon code sans le namspace il ne compile pas et m'affiche un message d'erreur .
          • Partager sur Facebook
          • Partager sur Twitter
            13 octobre 2019 à 16:04:06

            Bonjour Bernard,

            Ton dernier message n'est pas clair pour moi. De plus, tu n'a pas clos le sujet. Est-ce-que tu nous poses une nouvelle question ?

            Si tu cherche plus d'information au sujet de "..."s, tu peux trouver ça ici:

            https://en.cppreference.com/w/cpp/string/basic_string/operator%22%22s

            Comme tu le sais peut-être, quand tu écrit un littérale, par exemple le nombre 10, tu peux spécifier le type de ce nombre:

            • 10 est in entier
            • 10u est un entier non signé
            • 10l est un long entier

            Ces "qualifiers" sont dans la norme CPP (pas besoin de using namespace ...). ici c'est un peu la même chose, mais avec la lib standard et pas dans la norme, aussi il faut ajouter using namespace std::string_literals, pour dire au compilateur où il va trouver la définition de ce "s.

            Bonne continuation. Merci, si tu n'attends plus de réponse sur le sujet, de le clore (tout en haut).

            Bien cordialement

            • Partager sur Facebook
            • Partager sur Twitter
              13 octobre 2019 à 22:57:03

              Dedeun a écrit:

              mais avec la lib standard et pas dans la norme,

              (Juste une petite correction : la lib standard est dans la norme. La norme contient la partie langage et la partie lib standard - qui nécessite "std::")
              • Partager sur Facebook
              • Partager sur Twitter
                14 octobre 2019 à 19:22:03

                Oups! Bien vu, Gbdivers.

                Ma remarque était surtout de savoir si on avait bien répondu, ou s'il y avait encore une question. Le message n'est pas clair.

                Cordialement

                -
                Edité par Dedeun 25 octobre 2019 à 12:47:43

                • Partager sur Facebook
                • Partager sur Twitter
                  24 octobre 2019 à 8:43:04

                  excuser moi de ma réponse tardive et merci à vous de m'avoir aider vous avez bien répondu à ma question

                  merci encore et je clos donc  le sujet ;)  

                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 octobre 2019 à 9:50:13

                    Je suis encore dubitatif avec auto pour les types explicites. Pour moi auto est bien meilleur dans le cas d'une véritable expression. Sinon on va finir par écrire du python en C++

                    auto foo = int(1);
                    auto bar = std::string("aa");



                    • Partager sur Facebook
                    • Partager sur Twitter

                    git is great because Linus did it, mercurial is better because he didn't.

                      25 octobre 2019 à 10:06:09

                      markand a écrit:

                      Sinon on va finir par écrire du python en C++

                      ça veut pas dire que c'est une mauvaise chose ^^ justement python a souvent le crédit d'être très facilement lisible, si C++ peut lui emprunter cette qualité sans trop en souffrir, pourquoi s'en priver ;)

                      Pour ma part, j'utilise les déclarations explicites pour toutes les variables représentant le modèle de mon application, les infos essentielles. Après il m'arrive d'utiliser auto dans les variables intermédiaires, qu'elles proviennent d'expressions ou non.

                      Mais là où je trouve intéressant que le tuto suggère de déclarer ses variables avec auto, c'est que ça force à prendre le réflexe d'initialiser systématiquement et correctement les variables, ce qui est plutôt une bonne chose !

                      -
                      Edité par romantik 25 octobre 2019 à 10:10:56

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Dream on, Dream on, Dream until your dream comes true
                        25 octobre 2019 à 10:19:20

                        Beaucoup de langages utilisent des "auto" ou équivalents (set, var, etc) et les devs n'en meurent pas. Il faut reconnaître que c'est l'habitude qui fait qu'on n'aime pas ces syntaxes, pas parce qu'elles sont objectivement moins bonne.

                        auto foo = 1;
                        auto bar = "aa"s;
                        

                        Et il n'est pas nécessaire d’écrire le type. Les litterals sont suffisantes (dans ces cas) pour identifier les types.

                        D'ailleurs, l'utilisation de = ou de {} est aussi une question d'habitude.

                        A noter, dans un cours, le choix des syntaxes se basent souvent sur des raisons de progression pédagogiques, par forcement ce qu'on va rencontrer au boulot.

                        Et ca manque de const dans tous ces codes...

                        -
                        Edité par gbdivers 25 octobre 2019 à 10:20:17

                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 octobre 2019 à 18:21:18

                          gbdivers a écrit:

                          Beaucoup de langages utilisent des "auto" ou équivalents (set, var, etc) et les devs n'en meurent pas. Il faut reconnaître que c'est l'habitude qui fait qu'on n'aime pas ces syntaxes, pas parce qu'elles sont objectivement moins bonne.

                          auto foo = 1;
                          auto bar = "aa"s;
                          

                          Et il n'est pas nécessaire d’écrire le type. Les litterals sont suffisantes (dans ces cas) pour identifier les types.

                          D'ailleurs, l'utilisation de = ou de {} est aussi une question d'habitude.

                          A noter, dans un cours, le choix des syntaxes se basent souvent sur des raisons de progression pédagogiques, par forcement ce qu'on va rencontrer au boulot.

                          Et ca manque de const dans tous ces codes...

                          -
                          Edité par gbdivers 25 octobre 2019 à 10:20:17

                          Outre la question d'habitude , n'y a t-il pas quand meme une différence ( avec le = on a le constructeur qui est apellé PUIS l'operateur d'affectation et avec {} juste le constructeur ? )

                          • Partager sur Facebook
                          • Partager sur Twitter
                            30 octobre 2019 à 18:29:26

                            Zérotisme a écrit:

                            Outre la question d'habitude , n'y a t-il pas quand meme une différence ( avec le = on a le constructeur qui est apellé PUIS l'operateur d'affectation et avec {} juste le constructeur ? )

                            Non. La copy elision est garantie par la norme maintenant. Et les compilateur faisait déjà cette optimisation par défaut.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            c++ modernes chaines de caractère avec type auto

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown