5

のコンパイラサポートを待つのにうんざりしましたnullptrgcc 4.6はサポートしますが、新しいいくつかのディストリビューションがサポートしています)。

それで、完全にサポートされるまでのストップギャップとして、nullptr私はそれをエミュレートすることにしました。エミュレーションには2つの例があります。1つはここから、もう1つはウィキブックスからです

注目すべきことに、どちらの実装も。について言及していませんoperator ==。ただし、これがないと、次のコードはコンパイルされません

int* ptr = nullptr;
assert( ptr == nullptr ); // error here: missing operator ==

このoperator ==エラーはコンパイラのバグですか?より完全にエミュレートするには(および、、、など)が
必要operator ==です!=か?エミュレートされた取引と実際の取引の 違いは他にありますか?<<=nullptr
nullptr

4

3 に答える 3

3

不明な理由で失敗したC++0xコンパイラでコンパイルしました。C++03で正常にコンパイルされます。

于 2011-06-07T17:34:32.343 に答える
1

はい、そのようなことを実装する必要があります。ただし、暗黙の変換演算子が有効になっておらず、明示的な演算子を指定しなくても比較できないことに驚いています。

template<typename T> bool operator==(T* ptr, nullptr_t null) {
    return ptr == 0;
}
template<typename C, typename R> bool operator==(R C::* ptr, nullptr_t null) {
    return ptr == 0;
}
// And the reverse
于 2011-06-07T17:27:10.540 に答える
1

実際には、最初の例の参照からの公式提案で言及されています:

いくつかの一般的な既存のコンパイラを使用した実験では、セクション 2 で説明した一般的なユース ケースのいくつかについて、貧弱で誤解を招くようなコンパイラ診断が生成されることが示されています。 「const クラス」から「int」への関数が存在する」、「テンプレート引数は名前のない型を参照できない」、「これらのオペランドに一致する演算子「==」はなく、オペランドの型は int == const クラスである」.)一般的なユースケースで質の高い診断を提供するために、コンパイラは nullptr の特別な知識を追加する必要があります。

したがって、コンパイラがまだこのギャップを埋めていない場合は、自分で埋める必要があります。

于 2011-06-07T17:28:09.553 に答える