2014-05-04 15 views
7

prega di dare un'occhiata al seguente C++ 11 frammento:clang ++ compila unico programma C++ 11 utilizzando boost :: formato quando -std = C 11 opzione ++ è sceso

#include <boost/format.hpp> 

int main(int argc, char** argv) 
{ 
    auto s = boost::format(""); 
    return 0; 
} 

Quando compilo con clangore utilizzando il -std=c++11 ottengo il seguente errore:

$ clang++ -std=c++11 -o main main.cpp 
In file included from main.cpp:1: 
In file included from /usr/include/boost/format.hpp:19: 
In file included from /usr/include/boost/detail/workaround.hpp:41: 
In file included from /usr/include/boost/config.hpp:40: 
In file included from /usr/include/boost/config/select_stdlib_config.hpp:18: 
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.0/../../../../include/c++/4.9.0/cstddef:51:11: error: 
     no member named 'max_align_t' in the global namespace 
    using ::max_align_t; 
     ~~^ 
1 error generated. 

Senza la -std=c++11 tutto compila bene, ma clang stampa un avvertimento:

$ clang++ -o main main.cpp 
main.cpp:5:3: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions] 
    auto s = boost::format(""); 
^

Quindi, sembra che una soluzione valida sia quella di rilasciare il flag C++ 11, poiché la versione corrente di clang sembra essere in modalità C++ 11, comunque? Lo svantaggio è che riceverai molti avvertimenti.

C'è una soluzione migliore a parte passare completamente a gcc? Patch per il codice sorgente di boost :: format o gcc-libs va bene per me. Informazioni


Sistema:

  • Piattaforma: Arch Linux x86_64
  • versione Boost: 1.55.0-6
  • gcc-lib: 4.9.0-1
  • clang ++: 3.4 (tag/RELEASE_34/final)
+5

Suona come [un insetto dal clangore con libstdC++ 4.9] (https://bbs.archlinux.org/viewtopic.php?pid=1412317). – Chnossos

+0

Promemoria: non è sufficiente rilasciare 'std = C++ 11' su una singola TU per risolvere eventuali problemi, poiché ciò potrebbe potenzialmente interrompere l'ODR per tutte le entità dichiarate in (intestazioni incluse in) TU. Lungo quel percorso giace [UB] (http://en.wikipedia.org/wiki/Undefined_behavior). Quindi il rilascio di C++ 11 significherebbe lasciarlo per tutti i tuoi progetti (a meno che TU non includa nulla) – sehe

+4

Funziona alla grande con libC++ invece di libstdC++ e con libstdC++ fornito con gcc 4.8. Sospetto che sia stato questo cambiamento: http://gcc.gnu.org/gcc-4.9/porting_to.html (cerca max_align_t) –

risposta