Czym dokładnie jest nullptr?
Mamy teraz C++11 z wieloma nowymi funkcjami. Ciekawym i zagmatwanym (przynajmniej dla mnie) jest Nowy nullptr
.
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
?
4 answers
To nic dziwnego. ZarównoJak to jest słowo kluczowe i instancja typu?
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 typustd::nullptr_t
jest stałą wskaźnika null, a integralną stałą wskaźnika null można przekonwertować nastd::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ścienullptr
do wyboru wersji wskaźnika. PodanieNULL
lub0
błędnie wybrałoby wersjęint
.Cast of
nullptr_t
to a integral type needs areinterpret_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życiestatic_cast
.Standard wymaga
sizeof(nullptr_t)
byćsizeof(void*)
.
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:
- WikiBooks , z przykładowym kodem.
- tutaj w Stack Overflow: czy używasz NULL lub 0 (zero) dla wskaźników w C++?
template
- Grupa Google: comp.lang.c++.moderated-compiler dyskusja
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) { }
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