2016-05-31 12 views
11

Ich arbeitete mit einigen Zeitfunktionen heute und bemerkte, dass die Standardkonvertierung mit %r (oder %p) scheint nicht für die Eingabe über std::get_time() auf g ++ oder Clang ++ zu arbeiten. Siehe this live code version für g ++ und clang ++. Es scheint funktioniert wie erwartet unter Windows mit VC++ (siehe closely related question). Beachten Sie auch, dass der Effekt gleich ist, unabhängig davon, ob die Zeile imbue enthalten ist oder nicht. Das Gebietsschema auf meinem Linux-Rechner ist auf "en_US.UTF-8" eingestellt, wenn es darauf ankommt.Ist std :: get_time in g ++ und clang ++ gebrochen?

#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

Dies scheint ein Problem mit libstdC++ zu sein. Zusammenklang mit libC++ analysiert das gut. –

+0

@HowardHinnant: Sie sind [rechts] (http://coliru.stacked-crooked.com/a/e597ffb8e4d4497e). Soll ich die Frage wiederholen? – Edward

+0

Es sieht aus wie die [Implementierung] (https://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/include/bits/locale_facts_nonio.tcc?revision=219012&view=markup&pathrev=219013#l654) behandelt nicht% r oder% p. Wenn es einen anderen Ort gibt, wo sie behandelt werden sollen, kann ich es nicht finden. – interjay

Antwort

10

Da die Kommentatoren haben darauf hingewiesen, ist dies tatsächlich ein Bug (Unterlassung) in libstdc++. Eine bug report wurde eingereicht.

Verwandte Themen