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)
Suona come [un insetto dal clangore con libstdC++ 4.9] (https://bbs.archlinux.org/viewtopic.php?pid=1412317). – Chnossos
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
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) –