Czym dokładnie jest nullptr?

Mamy teraz C++11 z wieloma nowymi funkcjami. Ciekawym i zagmatwanym (przynajmniej dla mnie) jest Nowy nullptr.

Cóż, nie trzeba już tego paskudnego makra NULL.
int* x = nullptr;
myclass* obj = nullptr;
Nie rozumiem, jak to działa. Na przykład, Artykuł Wikipedii mówi:

C++11 koryguje to poprzez wprowadzenie nowego słowa kluczowego służącego jako wyróżniona stała wskaźnika null: nullptr. Jest to typ nullptr_t , który jest niejawnie zamienny i porównywalny do dowolnego typu wskaźnika lub typu wskaźnik-do-członka. Nie jest w sposób dorozumiany zamienny ani porównywalny do typów całkowych, z wyjątkiem bool.

Jak to jest słowo kluczowe i instancja typu?

Masz też inny przykład (obok Wikipedii), gdzie {[1] } jest lepszy od starego, dobrego 0?

Author: Josh Lee, 0000-00-00

4 answers

Jak to jest słowo kluczowe i instancja typu?

To nic dziwnego. Zarówno true, jak i false są słowami kluczowymi i jako literały mają typ (bool). nullptr jest literałem wskaźnika typu std::nullptr_t i jest wartością prvalue(nie można przyjąć jej adresu za pomocą &).
  • 4.10 o konwersji wskaźnika mówi, że wartość PR typu std::nullptr_t jest stałą wskaźnika null, a integralną stałą wskaźnika null można przekonwertować na std::nullptr_t. W przeciwnym kierunku nie jest dozwolone. Pozwala to na przeciążenie funkcji zarówno dla Wskaźników, jak i liczb całkowitych oraz przejście nullptr do wyboru wersji wskaźnika. Podanie NULL lub 0 błędnie wybrałoby wersję int.

  • Cast of nullptr_t to a integral type needs a reinterpret_cast, and has the same semantic as a cast of (void*)0 to a integral type (mapping implementation defined). A {[14] } nie można przekonwertować nullptr_t na dowolny typ wskaźnika. Polegaj na niejawnej konwersji, jeśli możliwe lub użycie static_cast.

  • Standard wymaga sizeof(nullptr_t) być sizeof(void*).

 360
Author: Johannes Schaub - litb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-25 04:21:04

Od nullptr: Bezpieczny i przejrzysty wskaźnik Null:

Nowe słowo kluczowe C++09 nullptr oznacza stałą rvalue, która służy jako uniwersalny wskaźnik null, zastępując wadliwy i słabo wpisany literał 0 oraz niesławne makro NULL. w ten sposób nullptr kładzie kres ponad 30-letniemu zakłopotaniu, dwuznaczności i błędom. Poniższe sekcje prezentują obiekt nullptr i pokazują, w jaki sposób może on zaradzić dolegliwościom NULL i 0.

Inne odniesienia:

 51
Author: nik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:31

Jeśli masz funkcję, która może odbierać wskaźniki do więcej niż jednego typu, wywołanie jej za pomocą NULL jest niejednoznaczne. Sposób, w jaki to działa, jest bardzo trudny, przyjmując int i zakładając, że to NULL.

template <class T>
class ptr {
    T* p_;
    public:
        ptr(T* p) : p_(p) {}

        template <class U>
        ptr(U* u) : p_(dynamic_cast<T*>(u)) { }

        // Without this ptr<T> p(NULL) would be ambiguous
        ptr(int null) : p_(NULL)  { assert(null == NULL); }
};

W C++11 można by przeciążyć nullptr_t tak, że ptr<T> p(42); byłby to błąd w czasie kompilacji, a nie czas wykonania assert.

ptr(std::nullptr_t) : p_(nullptr)  {  }
 33
Author: Motti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-10 07:28:27

Dlaczego nullptr w C++11? O co chodzi? Dlaczego NULL nie wystarczy?

C++ expert

 13
Author: ,
Warning: date() expects parameter 2 to be long, string given in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54