GCC 4.5 的 C++0x mode 還沒到堪用的程度

本文已作廢,心臟夠大顆的可以開了。

所以不要衝太快,
編大一點的程式遇到 list::sort(functor) 就炸了,
亂寫的範例:

錯誤訊息:

/.../gcc45/lib/gcc/x86_64-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/bits/list.tcc:392:3: error: cannot bind 'std::list' lvalue to 'std::list&&'
/.../gcc45/lib/gcc/x86_64-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/bits/stl_list.h:1178:7: error: initializing argument 2 of 'void std::list<_Tp, _Alloc>::splice(std::list<_Tp, _Alloc>::iterator, std::list<_Tp, _Alloc>&&, std::list<_Tp, _Alloc>::iterator) [with _Tp = A*, _Alloc = std::allocator, std::list<_Tp, _Alloc>::iterator = std::_List_iterator, std::list<_Tp, _Alloc> = std::list]'
sort.cxx:20:18: instantiated from here
/.../gcc45/lib/gcc/x86_64-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/bits/list.tcc:398:7: error: no matching function for call to 'std::list::merge(std::list&, Compare&)'
/.../gcc45/lib/gcc/x86_64-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/bits/list.tcc:234:5: note: candidates are: void std::list<_Tp, _Alloc>::merge(std::list<_Tp, _Alloc>&&) [with _Tp = A*, _Alloc = std::allocator, std::list<_Tp, _Alloc> = std::list]
sort.cxx:20:18: instantiated from here
/.../gcc45/lib/gcc/x86_64-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/bits/list.tcc:408:8: error: no matching function for call to 'std::list::merge(std::list&, Compare&)'
/.../gcc45/lib/gcc/x86_64-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/bits/list.tcc:234:5: note: candidates are: void std::list<_Tp, _Alloc>::merge(std::list<_Tp, _Alloc>&&) [with _Tp = A*, _Alloc = std::allocator, std::list<_Tp, _Alloc> = std::list]

mailing list 裡相關的 thread:
http://gcc.gnu.org/ml/gcc-bugs/2009-09/msg00316.html

附帶一提 GCC 4.4.2 的 C++0x mode 沒這問題,
不要太快衝上 4.5 應該就沒事。


Update: 2009-12-10
GCC 的 mailing list 上又有另一個人發現相似的問題,
簡單說就是從 list::merge() 那段開始炸下去,
list::sort() 會用到它所以其實跟那個 list::splice() 還是同一個問題:
http://gcc.gnu.org/ml/gcc/2009-12/msg00093.html
看來在 GCC 搞定這個問題之前類似的問題會重複被提起很多次。

Update: 2009-12-25
經再度測試,
目前 GCC 4.5.0 的 20091224 snapshot 已無此問題。

Update: 2010-01-12
目前 GCC 4.5 的穩定度已經不錯了,
確定可以在 x86-64 的 Gentoo 上用 g++ -std=gnu++0x 編譯 open64,
當然是我自己 local 端 maintain 的版本,
官方版的 open64 就要問阿共仔了;
也不是說我不想 feedback 給 open64,
畢竟 target 實在差太多 (他們是 x86-64),
而且整個 build system 我用 cmake 整個改寫了,
CG phase 也整個大重組,
還引進 C++0x 的 features 和 Boost C++ Libraries 1.41.0 來用,
這些先進技術並不是很多人能接受得了的,
要團隊裡每個人都有足夠的上進心才行 (在各方面),
programming 技術突然間從 1980 年代水準跳到 2010 年的水準,
可以預見的是即使有人願意接受也沒那個本事受得了,
不上進的心加上 30 年技術水準的差異,
不是光動嘴巴就能彌補的。