ポインター関係演算子は全順序を定義しません(C ++ 11標準の§5.9):
二つのポインタ場合
p
とq
同じオブジェクトまたは同じアレイの又は異なる機能の要素のメンバーではない別のオブジェクトに同じタイプの点の、またはそれらの一方のみがNULLである場合、の結果p<q
、p>q
、p<=q
、およびp>=q
不特定です。
std :: lessドキュメントによると:
std::less
任意のポインタ型に対するの部分的な特殊化は、組み込みがoperator<
そうでない場合でも、全順序を生成します。
半順序からこの全順序をどのように生成しますか?
私はを見て、この質問に答えることができません/usr/include/c++/4.9/bits/stl_function.h
のためのstruct less
定義:
template<typename _Tp = void>
struct less;
template<typename _Tp>
struct less : public binary_function<_Tp, _Tp, bool>
{
bool
operator()(const _Tp& __x, const _Tp& __y) const
{ return __x < __y; }
};
template<>
struct less<void>
{
template <typename _Tp, typename _Up>
auto
operator()(_Tp&& __t, _Up&& __u) const
noexcept(noexcept(std::forward<_Tp>(__t) < std::forward<_Up>(__u)))
-> decltype(std::forward<_Tp>(__t) < std::forward<_Up>(__u))
{ return std::forward<_Tp>(__t) < std::forward<_Up>(__u); }
typedef __is_transparent is_transparent;
};
半順序からこの全順序をどのように生成しますか?
規格は、何かがどのように達成されるべきかをめったに述べていません。代わりに、何が必要かを示しています。そして、これはまさにその通りです。規格ではstd::less
、§20.9.6/ 14で全順序を提供する必要があります。
テンプレートgreater、less、greater_equal、less_equalの場合、組み込み演算子<、>、<=、> =が生成しない場合でも、任意のポインター型の特殊化により全順序が生成されます。
一方でoperator<
、この点での振る舞いがあり、不特定§5.9/ 4(あなたがあなたの質問を持っている引用符)によります。
不特定の動作は、§1.3.25で次のように定義されています。
実装に依存する、整形式のプログラム構成と正しいデータの動作[...]
特定の実装では、operator<
すでに全順序を提供しているため(おそらく、ポインター型が32ビットまたは64ビットのアドレスとして実装されているため、符号なし整数に似たものとして簡単に解釈でき、全順序が得られます)、std::less
単純にその演算子への引数。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加