42 votes

Le C++14 chiffres de séparateurs de permis, définies par l'utilisateur littéraux?

Alors que clang compile la ligne suivante, g++ 6.1 se plaint du chiffre séparateur (voir l' exemple vivant sur Coliru):

auto time = 01'23s;

Le compilateur, si tout est correct selon le C++14 standard (N3796)?

Sinon, est de permettre aux chiffres des séparateurs (§2.14.2) juste un détail d'implémentation dans l'définis par l'utilisateur littéraux (§2.14.8) de l' <chrono> bibliothèque (§20.12.5.8)? À mon humble avis il ne devrait pas être, puisque ces littéraux sont définis sur unsigned long long paramètres.

Je me souviens de Howard Hinnant l'aide d' 10'000s comme un exemple au cours de son CppCon 2016 discutez "<chrono> tutoriel" (à environ 42 minutes dans son discours).


(Veuillez noter que je n'ai pas l'intention de code "1 minute et 23 secondes", qui est correcte seulement par accident, depuis le octal littérale 0123 est 64 + 16 + 3 == 83. Pour cela je devrais écrire

auto time = 1min + 23s;

mais que possible trompeuse interprétation ne fait pas partie de la question.)

19voto

KrzaQ Points 1

Si vous regardez la grammaire, défini par l'utilisateur-entier littéral peut être octal littérale ud-suffixe, et octal-littérale , est défini comme 0 ou octal littérale 'opt octal chiffres.

N4140 §2.14.8

défini par l'utilisateur-littérale:

  • défini par l'utilisateur-entier littéral
  • [...]

défini par l'utilisateur-entier littéral:

  • octal littérale ud-suffixe
  • [...]

N4140 §2.14.2

octal littérale:

  • 0
  • octal littérale 'opt octal chiffres

Donc, 01'23s est parfaitement valide littérale.

5voto

Columbo Points 11661

WLOG pour les décimales de littéraux:

[lex.ext]:

défini par l'utilisateur-entier littéral:
    virgule-littérale ud-suffixe

[lex.icône]:

virgule-littérale:
    différent de zéro chiffres
    virgule-littérale 'opt chiffres

I. e. oui, les chiffres, les séparateurs sont autorisés dans UDLs.

5voto

René Richter Points 1657

Cela semble être un bug de GCC de la mise en œuvre de l' <chrono> bibliothèque, comme @Aaron McDaid a suggéré. Il y a une (actuellement non confirmées) rapport de bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69905

GCC est libstdc++ implémente deux signatures std::chrono_literals:

constexpr chrono::duration<long double>
operator""s(long double __secs)
{ return chrono::duration<long double>{__secs}; }

template <char... _Digits>
  constexpr chrono::seconds
  operator""s()
  { return __check_overflow<chrono::seconds, _Digits...>(); }

La version du modèle qui donne l'erreur n'est pas requis par la norme. Lors de l'ajout d'

constexpr chrono::seconds
operator""s(unsigned long long __secs)
{ return chrono::seconds{__secs}; }

à l' <chrono> - tête (de mon installation locale) l'erreur dissappears.

Cependant, GCC de la bibliothèque de l'exécutants peuvent avoir quitté cette version sur le but, ils peuvent empêcher les indésirables non signé signé de conversion, puisque les secondes sont définis comme

typedef duration<int64_t> seconds;

Edit:

Comme l'a récemment souligné par Jonathan Wakely dans les commentaires du rapport de bug, la mise en œuvre a été choisie par la conception dans le cadre d'une ouvrir la Bibliothèque Groupe de Travail sur la question, mais n'a pas pris chiffres séparateurs en compte.

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