Можно ли эллировать nptptr в gcc?
Я видел, что nullptr
был реализован в Visual Studio 2010. Мне нравится концепция и вы хотите начать ее использовать как можно скорее; однако GCC пока не поддерживает его. Мой код должен работать на обоих (но не должен компилироваться с другими компиляторами).
Есть ли способ "подражать" его? Что-то вроде:
#define nullptr NULL
(Очевидно, что это не сработало бы хорошо, просто чтобы показать, что я имею в виду.)
Ответы
Ответ 1
Официальное предложение имеет обходное решение -
const // this is a const object...
class {
public:
template<class T> // convertible to any type
operator T*() const // of null non-member
{ return 0; } // pointer...
template<class C, class T> // or any type of null
operator T C::*() const // member pointer...
{ return 0; }
private:
void operator&() const; // whose address can't be taken
} nullptr = {}; // and whose name is nullptr
Ответ 2
Похоже, что gcc поддерживает nullptr как 4.6.
Ответ 3
Кроме того, gcc (на самом деле g++) имеет расширение __null в течение многих лет. Это было учтено как опыт внедрения в отрасли, когда появилось предложение nullptr.
Расширение __null может обнаруживать особые случаи и предупреждать о них, например, случайно передавать NULL в параметр bool, когда он должен был быть передан параметру указателя (изменения, внесенные в функцию, забыли адаптировать сторону вызова).
Конечно, это не переносимо. Решение шаблона выше переносимо.
Ответ 4
Он выглядит по gcc 4.6.1 (Ubuntu 11.11 oneiric), добавлен nullptr.
Быстрая, рекурсивная sed find-and-replace в моих файлах hpp/cpp отлично работала для меня:
find . -name "*.[hc]pp" | xargs sed -i 's/NULL/nullptr/g'
Ответ 5
Скорее всего, вы забыли -std = С++ 0x.
Моя версия MQL версии gcc - 4.6.1/4.7.1, обе поддерживают нульпт хорошо.
В соответствии с описанием в "Стандартной библиотеке С++, учебном пособии и ссылке, 2nd", nullptr - это ключевое слово, может автоматически преобразовывать в каждый тип указателя, но не целочисленный тип, это устраняет недостаток NULL, который неоднозначен для следующая функция перегрузки:
void f (int);
void f (void *);
F (NULL);//Неоднозначные
F (nullptr);//OK
Тестирование этой функции в VC2010 показывает, что документ MSDN конфликтует с фактическим компилятором, документ сказал:
Ключевое слово nullptr не является типом и не поддерживается для использования с:
SizeOf
TypeId
throw nullptr
Фактически в VC2010 все вышеперечисленные операторы/выражения являются законными. sizeof (nullptr) 4. typeid.name() result std:: nullptr_t, а throw nullptr может быть обнаружен "const void *" и "void *" (и другими типами указателей).
В то время как gcc (4.7.1) выглядит более жестким относительно nullptr, throw nullptr не может быть захвачен "void *", может быть обнаружен "..."