2017-09-21 69 views
7

Đoạn mã sau cung cấp các kết quả khác nhau với trình biên dịch g ++ 7 và Apple clang ++. Tôi đã chạy vào một lỗi trong clang trong sự liên kết của đầu ra bool khi std::boolalpha được sử dụng, hoặc tôi đã làm cho một sai lầm?Tại sao std :: boolalpha bỏ qua chiều rộng trường khi sử dụng tiếng kêu?

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

template<typename T> 
void print_item(std::string name, T& item) { 
    std::ostringstream ss; 
    ss << std::left << std::setw(30) << name << "= " 
     << std::right << std::setw(11) << std::setprecision(5) 
     << std::boolalpha << item << " (blabla)" << std::endl; 

    std::cout << ss.str(); 
} 

int main() { 
    int i = 34; 
    std::string s = "Hello!"; 
    double d = 2.; 
    bool b = true; 

    print_item("i", i); 
    print_item("s", s); 
    print_item("d", d); 
    print_item("b", b); 

    return 0; 
} 

Sự khác biệt là:

// output from g++ version 7.2 
i        =   34 (blabla) 
s        =  Hello! (blabla) 
d        =   2 (blabla) 
b        =  true (blabla) 
// output from Apple clang++ 8.0.0 
i        =   34 (blabla) 
s        =  Hello! (blabla) 
d        =   2 (blabla) 
b        = true (blabla) 
+0

sự khác biệt là gì? Cảm ơn bạn Chiel đã cập nhật. Tôi có thể tái sản xuất với Clang 6. – gsamaras

+0

in ra đặt trong câu hỏi quá. viết kết quả: – saeed

+0

@gsamaras. Tôi hơi chỉnh sửa ví dụ để hiển thị tốt hơn những gì xảy ra sai. – Chiel

Trả lời

4

Tại T.C. đề cập, đây là LWG 2703:

Không có quy định cho fill-đệm khi boolalpha được thiết lập

N4582 phân lớp 25.4.2.2.2 [facet.num.put.virtuals] đoạn 6 làm không điều khoản để điền đệm trong đặc điểm kỹ thuật của hành vi khi(str.flags() & ios_base::boolalpha) != 0.

Kết quả là tôi không thấy giải pháp này với Clang. Tuy nhiên, hãy lưu ý rằng:

  • libC++ thực hiện chính xác điều này.
  • libstdC++ và MSVC áp dụng đệm và căn chỉnh.

PS: LWG là viết tắt của Nhóm làm việc thư viện.

+0

Được rồi. Thật không may, 'libstdC++' không quá thân thiện với mã C++ 11 của tôi. – Chiel

+0

@Chiel đó là một vấn đề khác. Có lẽ điều này sẽ giúp: [Phiên bản nào của thư viện C++ trên Linux tuân thủ tiêu chuẩn “ISO C++ 11”?] (Https://stackoverflow.com/questions/10824963/which-version-of-c-library-on-linux- phù hợp với tiêu chuẩn-is-is-c-11). Chúc may mắn! – gsamaras

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