2016-05-31 17 views
11

Tôi đã làm việc với một số chức năng thời gian hôm nay và nhận thấy rằng chuyển đổi tiêu chuẩn sử dụng %r (hoặc %p) dường như không hoạt động đối với đầu vào qua std::get_time() trên g ++ hoặc clang ++. Xem this live code version cho g ++ và clang ++. Nó hiện dường như hoạt động như mong đợi trong Windows với VC++ (xem này closely related question). Cũng lưu ý rằng hiệu quả là giống nhau hay không có dòng imbue được bao gồm. Miền địa phương trên máy Linux của tôi được đặt thành "en_US.UTF-8" nếu nó quan trọng.Là std :: get_time bị hỏng trong g ++ và 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

Điều này có vẻ là vấn đề libstdC++. clang với libC++ phân tích cú pháp này. –

+0

@HowardHinnant: Bạn đang [phải] (http://coliru.stacked-crooked.com/a/e597ffb8e4d4497e). Tôi có nên trả lời câu hỏi này không? – Edward

+0

Dường như [triển khai] (https://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/include/bits/locale_facets_nonio.tcc?revision=219012&view=markup&pathrev=219013#l654) không xử lý '% r' hoặc'% p'. Nếu có một nơi khác mà họ phải được xử lý, tôi không thể tìm thấy nó. – interjay

Trả lời

10

Khi người nhận xét đã chỉ ra, đây thực sự là lỗi (thiếu sót) trong libstdc++. Đã gửi bug report.

Các vấn đề liên quan