Идеально подражать nullptr - PullRequest
5 голосов
/ 07 июня 2011

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 07 июня 2011

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

1 голос
/ 07 июня 2011

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

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

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

1 голос
/ 07 июня 2011

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...