Отлично эмулировать 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