2017-09-21 16 views
7

निम्नलिखित कोड g ++ 7 कंपाइलर और ऐप्पल क्लैंग ++ के साथ अलग-अलग परिणाम देता है। क्या मैंने std::boolalpha का उपयोग किया है, या मैंने गलती की है, तो क्या मैंने बूल आउटपुट के संरेखण में क्लैंग में एक बग में भाग लिया था?क्लैंग का उपयोग करते समय std :: boolalpha फ़ील्ड चौड़ाई को अनदेखा क्यों करता है?

#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; 
} 

अंतर है:

// 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

क्या अंतर था? अद्यतन करने के लिए आप चिएल धन्यवाद। मैं क्लैंग 6 के साथ भी पुन: पेश कर सकता हूं। – gsamaras

+0

प्रिंट आउट भी प्रश्न में डाल दिया। परिणाम लिखें: – saeed

+0

@gsamaras। मैं थोड़ा सा गलत दिखाने के लिए उदाहरण को थोड़ा सा संपादित करता हूं। – Chiel

उत्तर

4

T.C. पर उल्लेख किया है, इस LWG 2703 है:

भरने गद्दी के लिए कोई प्रावधान नहीं है जब boolalpha सेट कर दिया जाता

N4582 उपखंड 25.4.2.2.2 [facet.num.put.virtuals] पैरा 6 बनाता है कोई पर(str.flags() & ios_base::boolalpha) != 0 व्यवहार के विनिर्देशन में भरने-पैडिंग के प्रावधान।

परिणामस्वरूप मुझे क्लैंग के साथ इसका समाधान नहीं दिख रहा है। हालांकि, ध्यान दें कि:

  • libC++ यह बिल्कुल लागू करता है।
  • libstdC++ और एमएसवीसी पैडिंग और संरेखण लागू करते हैं।

पीएस: एलडब्लूजी लाइब्रेरी वर्किंग ग्रुप के लिए खड़ा है।

+0

ठीक है। दुर्भाग्यवश, 'libstdC++' मेरे C++ 11 कोड के लिए बहुत अनुकूल नहीं है। – Chiel

+0

@Cheel यह एक और मुद्दा है। शायद यह मदद करता है: [लिनक्स पर सी ++ लाइब्रेरी का कौन सा संस्करण "आईएसओ सी ++ 11" मानक के अनुरूप है?] (Https://stackoverflow.com/questions/10824963/which-version-of-c-library-on-linux- अनुरूप करने के लिए-इसो-सी 11 की मानक)। सौभाग्य! – gsamaras

संबंधित मुद्दे