Подтвердить что ты не робот

Можно ли эллировать nptptr в gcc?

Я видел, что nullptr был реализован в Visual Studio 2010. Мне нравится концепция и вы хотите начать ее использовать как можно скорее; однако GCC пока не поддерживает его. Мой код должен работать на обоих (но не должен компилироваться с другими компиляторами).

Есть ли способ "подражать" его? Что-то вроде:

#define nullptr NULL

(Очевидно, что это не сработало бы хорошо, просто чтобы показать, что я имею в виду.)

4b9b3361

Ответ 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 *", может быть обнаружен "..."