('A`) ハァ…疲れた.
Spiritで生成した構文木(ASTだけど)のノードをソートするという「何故そんなことをする必要があるのか?」的ことをやっていて,そのためにstd::sortを使っていたんだけど,MSVC++7.1とGCCで挙動が違ってその原因追求にかなり四苦八苦してた.
原因は
template<class T> void boost::spirit::swap(boost::spirit::tree_node<T> &, boost::spirit::tree_node<T> &);
をstd::sortがADL経由でlook-upしてくれるかどうか使ってくれるかどうかの違いだった.GCCのstd::sortはこのオーバーロードをADL経由でlook-upしてくれない使ってくれない模様・・・.GCCのstd::sortの実装読んでないけれどADLがbugってるかsortを名前空間のqualification付けた形で呼んでいるかのどちらかだにゃ,こりゃ.GCCのstd::sortはstd::iter_swap呼ぶけれどそのstd::iter_swapがswapを呼ばない実装なので,上のオーバーロードは呼ばれるわけがない,ってオチ.っていうか,以前から自分自身で指摘していた問題(id:Cryolite:20041023#1とか参照)そのまんまな問題にハマってやんのorz.これ書いてた当時はまさか自分自身がこれにハマるとは夢にも思っていなかった・・・.っていうか,早くADL経由でlook-upされるユーザー定義のswapのオーバーロードへの委譲を明確化するよう標準の文言を修正して下さい・・・.おながいします・・・.
っていうか,そもそもboost::spirit::tree_nodeはassignableだからデフォのstd::sortでもsemanticsは変わらないはずなのになんでそっちだと挙動が変わりますか?原因追求してfeedbackしたいけれどそんな時間にゃいですよ・・・.
#う〜?swapはunqualifiedで呼ばれてるし,似たような状況で試してみても特にADLがbugってるわけじゃないみたいだし・・・???
#まさかGCCだとバグってましたとかそういうオチはないよな・・・.
#あ〜そういうオチか.そりゃiter_swapがswap呼ばない実装だといくらswapオーバーロードしても呼ばれんわなorz.早くこれ標準改定してください.おながいします,このとおりです・・・.
#全然関係ないけれどGCCのヘッダのファイル群の中にboostのBCCLのヘッダ(・∀・)ハケーン.