2016-05-31 16 views
11

Pracowałem z niektórymi funkcjami czasu dzisiaj i zauważyłem, że standardowa konwersja przy użyciu %r (lub %p) wydaje się nie działać dla danych wejściowych poprzez std::get_time() na g ++ lub clang ++. Zobacz this live code version dla g ++ i clang ++. To ma wydaje się działać zgodnie z oczekiwaniami w systemie Windows z VC++ (zobacz ten closely related question). Zwróć też uwagę, że efekt jest taki sam niezależnie od tego, czy linia imbue jest dołączona. Ustawienia regionalne na moim komputerze z systemem Linux są ustawione na "en_US.UTF-8", jeśli to ma znaczenie.Czy std :: get_time jest uszkodzony w g ++ i clang ++?

#include <iostream> 
#include <iomanip> 
#include <sstream> 
#include <string> 
#include <ctime> 

int main(){ 
    std::tm t{}; 
    std::stringstream ss{"1:23:45 PM"}; 
    ss.imbue(std::locale(std::cin.getloc(), 
      new std::time_get_byname<char>("en_US"))); 
    ss >> std::get_time(&t, "%r"); 
    if (ss.fail()) { 
     std::cout << "Conversion failed\n" << std::put_time(&t, "%r") << '\n'; 
    } else { 
     std::cout << std::put_time(&t, "%r") << '\n'; 
    } 
} 
+8

To wydaje się być problem z libstdC++. clang z libC++ parsuje to dobrze. –

+0

@HowardHinnant: Jesteś [w prawo] (http://coliru.stacked-crooked.com/a/e597ffb8e4d4497e). Czy powinienem powtórzyć pytanie? – Edward

+0

Wygląda na [implementację] (https://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/include/bits/locale_facets_nonio.tcc?revision=219012&view=markup&pathrev=219013#l654) nie obsługuje '% r' lub'% p'. Jeśli istnieje inne miejsce, w którym mają być obsługiwane, nie mogę go znaleźć. – interjay

Odpowiedz

10

Jak komentujących podkreśliło, to rzeczywiście błąd (pominięcie) w libstdc++. Przesłano bug report.

Powiązane problemy