|
■No74539 (774RR さん) に返信
774RRさん、詳細な解説ありがとうございます。 深く理解することが出来てとても嬉しいです。
> 「未規定」 unspecified であると書いてある。 確かに「未規定」と書いてありました。未定義と未規定ってまったく意味が違うんですね。 深く意識せずに未定義と脳内変換してしまってました。
> んで、手元の GCC 4.8.2, GCC 4.5.3, VC++2005 で探してみたけどどれも std::less の特殊化を > 実装してない。どれも generic に x<y しているだけだ。ということは 5.9 の文言に基づき > 最初に述べた結論になる。 ご調査ありがとうございます。 私も VC++ 2010 で探してみたけどstd::less の特殊化は実装されていませんでした。 逆に考えると、20.3.3 - 8で std::less の全順序保証が明記されているのに特殊化されていないということは、 これらの処理系では ポインター型の大小比較が組み込み演算子でも全順序であることの証明になりますね。
> この辺 C++ では改善されてるんだ・・・知らんかった。勉強になったですよ。 こちらこそ、とても勉強になりました。ありがとうございます。 #私は C++ から入ったので C は深くは知らないですが、C++でよかったなと思います。 #たぶん、C だと不便に感じちゃうと思います。
以下、まとめです。
■2つの異なったオブジェクトを指すポインター間の大小比較について ・組み込みの関係演算子での大小比較は未規定(未定義ではないのでプログラムとしては正しいが詳細は実装依存) ・一般的に32bit/64bit マシンではポインタをメモリアドレスで実装しているので、大小比較は指し示すアドレス で行われると考えられる。 ・std::less での大小比較は全順序となることが保証されている。 ・GCC 4.8.2, GCC 4.5.3, VC++ 2005, VC++ 2010 では std::less のポインター型に対する特殊化を実装しておらず、 x < yとしているだけ。 よって、これらの処理系では組み込みの関係演算子での大小比較も全順序となると考えられる。 詳細は No74539 を参照。
■std::mapのキーやstd::setでのポインター型使用について ・条件を満たせばポインター型の使用は問題ない。 ・必要であれば独自のless_comparatorを提供する。 詳細は No74525 を参照。
|