Петр Гавриков
июль 2017.
768

Как реализовать nullptr при стандарте c++ 98?

Ответить
Ответить
Комментировать
0
Подписаться
0
2 ответа
Поделиться

Ни разу не писатель и C++ не владею. Но ответить решил, ибо самому стало интересно.

Первое, что пришло в голову — это #define nullptr_t NULL. Ну а что, NULL ведь тоже нулевой указатель, разве нет?

Через 14 секунд в гугле я понял, что глубоко ошибся. Потому что NULL лёгким движением руки мистера Компилятора превращается в 0, ведь NULL есть (void *)0 ещё с семидесятых годов. Да и на nullptr_t не обратил внимание.

В общем, нашёл я на StackOverflow ответ и какую-то ссылку (не читал, но одобряю), и ответ напросился в виде такого заголовочного файла. Для проверки этого начиркал такую «программу».

Во-первых, украл. Во-вторых, проверка стандарта упоротая, но как смог нагуглить. В-третьих, пример обоссан. Но на GCC 7.1.1 всё прекрасно компилируется и с -std=c++11, и с -std=c++98 и вроде бы работает.

1
0
Прокомментировать

How to do that is mentioned in the book: Effective C++, 2nd edition by Scott Meyers in chapter: "Item 25: Avoid overloading on a pointer and a numerical type.".

It is needed if your compiler doesn't know the nullptr keyword introduced by C++11.

const /* this is a const object... */

class nullptr_t

{

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; /* Can't take address of nullptr */

} nullptr = {}; /* and whose name is nullptr */

That book is definitely worth reading.

Взял отсюда stackoverflow.com

0
0
Прокомментировать
Ответить
Читайте также на Яндекс.Кью
Читайте также на Яндекс.Кью