Partage
  • Partager sur Facebook
  • Partager sur Twitter

Qu'est-ce qui n'est pas un litéral ?

    8 mai 2023 à 15:22:09

    Salut à tous !

    Je suis en train de lire cet page de cppreference https://en.cppreference.com/w/cpp/named_req/LiteralType qui explique que les litéraux sont :

    • des scalaires (int, double, enum, pointer, nullptr)
    • des références
    • des array de litéraux
    • des classes avec un destructeur trivial (et d'autres propriétés mais j'avoue que je n'ai pas tout compris)

    Du coup ça veut dire que tout en C++ est un litéral à part les classes avec un destructeur non-trivial ?

    -
    Edité par Autechre 8 mai 2023 à 15:22:27

    • Partager sur Facebook
    • Partager sur Twitter
      8 mai 2023 à 18:39:19

      Bonjour,

      Un littéral c'est un objet qui peut être construit au moment de la compilation, et dont la destruction consiste à ne rien faire.
      En sont donc exclus:
      - les fonctions
      - la plupart des classes et des unions, et les tableaux de ces classes et unions.

      La contrainte sur les classes n'est pas négligeable. Par exemple std::string ou toute classe qui en contient n'est pas un litéral.

      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        8 mai 2023 à 18:58:31

        Depuis le C++20, les string peuvent être constexpr et donc des littérales.

        Plus généralement, le C++ essaie d'avoir de plus en plus de choses qui sont constexpr et donc peuvent être des littérales.

        Une fonction peut être constexpr et donc servir a construire un type littérale. Et le type d'un pointeur de fonction peut également être une littérale.

        Par contre, il faut bien comprendre que si beaucoup de types peuvent être des types littéraux, ca veut pas dire qu'un type qui peut être un type littérale le sera.

        constexpr int i = 123; // le type de i est un type littéral
        int j = 123; // le type de j n'est pas un type littéral

        -
        Edité par gbdivers 8 mai 2023 à 19:03:25

        • Partager sur Facebook
        • Partager sur Twitter
          8 mai 2023 à 19:53:16

          Le mieux est de revenir aux définitions données dans les normes (et projets de norme, qui sont librement accessibles)

          https://timsong-cpp.github.io/cppwp/n4868/lex.literal.kinds

          (N4868 (PDF, HTML) - C++20 first post-publication draft (contains editorial fixes to C++20 only))

          5 Lexical conventions [lex]

          5.13 Literals [lex.literal]

          • Partager sur Facebook
          • Partager sur Twitter
            8 mai 2023 à 20:02:58

            Tu as confondu les "literals" et les "literal types". Le second (dont on parle ici) est dans 6.8.1 : https://timsong-cpp.github.io/cppwp/n4868/basic.types#general-10 

            • Partager sur Facebook
            • Partager sur Twitter

            Qu'est-ce qui n'est pas un litéral ?

            × 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