2016-05-31 72 views
11

我今天正在使用一些時間函數,並注意到使用%r(或%p)的標準轉換似乎不適用於通過g ++或clang ++上的std::get_time()輸入。有關g ++和clang ++,請參閱this live code version。它確實似乎按照預期在Windows下使用VC++工作(請參閱此closely related question)。還要注意,無論是否包含imbue行,效果都是相同的。如果有問題,我的Linux機器上的語言環境設置爲"en_US.UTF-8"std :: get_time在g ++和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

這似乎是一個libstdC++問題。與libC++鏗鏘解析這個罰款。 –

+0

@HowardHinnant:你是[right](http://coliru.stacked-crooked.com/a/e597ffb8e4d4497e)。我應該改變這個問題嗎? – Edward

+0

看起來像[實施](https://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/include/bits/locale_facets_nonio.tcc?revision=219012&view=markup&pathrev=219013#l654 )不處理'%r'或'%p'。如果有另一個地方他們應該被處理,我找不到它。 – interjay

回答

10

正如評論者所指出的,這實際上是libstdc++中的一個錯誤(遺漏)。 A bug report已提交。

相關問題