Podczas dzyń kompiluje następujący wiersz, g ++ 6.1 narzeka separator cyfr (patrz live example on Coliru):Czy separatory C++ 14-cyfrowe są dozwolone w zdefiniowanych przez użytkownika literałach?
auto time = 01'23s;
Który kompilator, jeżeli istnieje, jest poprawna według standardu C++ 14 (N3796)?
W przeciwnym razie, pozwala na to, że separatory cyfrowe (§2.14.2) są tylko szczegółami implementacji w zdefiniowanych przez użytkownika literałach (§ 2.14.8) biblioteki <chrono>
(§20.12.5.8)? IMHO powinno nie być, ponieważ te literały są zdefiniowane na parametrach unsigned long long
.
Pamiętam Howarda Hinnanta używającego 10'000s
jako przykład podczas jego CppCon 2016 talk "A <chrono>
tutorial" (około 42 minut w jego wykładzie).
(Należy pamiętać, że nie zamierzają kod "1 minutę i 23 sekund", który jest prawidłowe tylko przez przypadek, ponieważ ósemkowa dosłownewynosi 64 + 16 + 3 == 83. w tym celu należy napisać
auto time = 1min + 23s;
ale możliwa interpretacja nie jest mylące część pytania).
Wygląda na błąd biblioteki i powinien zostać zgłoszony. Moje ograniczone eksperymenty sugerują, że 'libstdC++' definiuje niewłaściwy rodzaj operatora dosłownego, przyjmując szablonowe nie-typowe parametry 'szablon' zamiast 'unsigned long long'. Ale to nie jest wymagane przez standard i robi to źle. Zostawili operatora 'operatora '(unsigned long long)', myślę, że to jest podstawowy problem. (Mają "operatora" (długie podwójne) ', zgodnie z wymaganiami) –
Błąd został zgłoszony tutaj: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69905 (Ktoś inny opublikował ten link , a następnie skasowałem ich komentarz, ale myślę, że jest to poprawny link!) –
@Aaron McDaid: Usunąłem ten komentarz, dodając go w mojej własnej odpowiedzi (patrz poniżej). –