2017-09-21 3 views
7

Der folgende Code gibt unterschiedliche Ergebnisse mit dem G ++ 7-Compiler und Apple Clang ++. Habe ich einen Fehler bei der Ausrichtung der Bool-Ausgabe festgestellt, wenn std::boolalpha verwendet wurde, oder habe ich einen Fehler gemacht?Warum ignoriert std :: boolalpha die Feldbreite bei der Verwendung von clang?

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

Der Unterschied ist:

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

Was war der Unterschied? Danke Chiel für die Aktualisierung. Ich kann auch mit Clang 6 reproduzieren. – gsamaras

+0

ausdrucken auch in Frage stellen. Ergebnisse schreiben: – saeed

+0

@gsamaras. Ich habe das Beispiel etwas bearbeitet, um besser zu zeigen, was schief läuft. – Chiel

Antwort

4

Bei T. C. erwähnt, ist dies LWG 2703:

Keine Bestimmung für fill-padding wenn boolalpha gesetzt

N4582 Subklausel 25.4.2.2.2 [facet.num.put.virtuals] Absatz 6 macht keine Bestimmung für Fill-Padding in seiner Spezifikation des Verhaltens wenn(str.flags() & ios_base::boolalpha) != 0.

Als Ergebnis sehe ich keine Lösung mit Clang. Beachten Sie jedoch Folgendes:

  • libC++ implementiert dies genau.
  • libstdC++ und MSVC wenden Padding und Ausrichtung an.

PS: LWG steht für Library Working Group.

+0

In Ordnung. Leider ist 'libstdC++' für meinen C++ 11-Code nicht allzu freundlich. – Chiel

+0

@Chiel, das ist ein anderes Problem. Vielleicht hilft das: [Welche Version der C++ - Bibliothek unter Linux entspricht dem "ISO C++ 11" -Standard?] (Https://stackoverflow.com/questions/10824963/which-version-of-c-library-on-linux- entsprechen dem-iso-c-11-Standard). Viel Glück! – gsamaras

Verwandte Themen