Отлично эмулировать nullptr

Я устал ждать поддержки компилятора nullptr ( gcc 4.6 делает, но это так мало, некоторые дистрибутивы поддерживают его).

Так как остановка разрыва до nullptr полностью поддерживается, я решил подражать. Есть два примера эмуляции: один отсюда и один из вики-книг.

Следует отметить, что ни одна реализация не упоминает operator ==, Однако без таковой следующий код не будет компилироваться.

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

Это operator == ошибка компилятора?
Является operator == (а также !=, <, <=и т. д.) необходимо более идеально подражать nullptr?
Чем еще отличается эмулируемый nullptr а реальная сделка?

3 ответа

Решение

Вы скомпилировали его с помощью компилятора C++0x, который потерпел неудачу по неизвестной причине. Он прекрасно компилируется в C++ 03.

Это на самом деле упоминается в официальном предложении из вашего первого примера ссылки:

Эксперименты с несколькими популярными существующими компиляторами показывают, что он генерирует плохую и / или вводящую в заблуждение диагностику компилятора для нескольких общих случаев использования, описанных в разделе 2. (Примеры включают: "нет преобразования из" const "в" int ";" нет подходящего преобразования ") функция от "const class" до "int‟ существует ";" аргумент шаблона не может ссылаться на безымянный тип ";" ни один оператор "==‟ не соответствует этим операндам, типы операндов: int == const class ".) Мы считаем, что что компиляторам все еще нужно будет добавить специальные знания о nullptr, чтобы обеспечить качественную диагностику для общих случаев использования.

Таким образом, вы должны заполнить этот пробел самостоятельно, если компилятор еще не сделал.

Да, вы должны реализовать такую ​​вещь. Я, однако, удивлен тем, что неявные операторы преобразования не включаются и позволяют вам сравнивать без предоставления явного оператора.

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
Другие вопросы по тегам