2011-11-02 11 views
11

Mi stavo chiedendo perché ci sono due modi per specificare un puntatore nullo. Ho esaminato lo link, ma non ho compreso chiaramente il suo utilizzo.nullptr vs __nullptr

Qualcuno può dare un buon esempio di quando utilizzare cosa?

risposta

22

Il linguaggio C++/CLI aveva già una parola chiave nullptr dal 2005. Ciò ha causato un problema quando C++ 11 ha adottato la parola chiave nullptr per C++. Ora ce ne sono due, uno per il codice gestito e l'altro per il codice nativo. Il compilatore C++/CLI può compilare entrambi. Quindi devi usare __nullptr quando intendi il puntatore nullo nativo, nullptr quando intendi il puntatore nullo gestito.

Questo è rilevante solo quando si compila con/clr in effetto. Scrivi codice C++/CLI in altre parole. Usa semplicemente nullptr in codice C++.

+0

Penso che il bit su/clr sia probabilmente la parte più importante di questa risposta. Se non sei interessato ad agganciare il tuo codice C++ a .NET Framework, dovresti sempre usare 'nullptr'. –

+0

Essendo veramente pedante, era già un problema (anche se raramente rilevante prima) con il porting del codice C++ in C++/CLI prima che esistesse C++ 11. – Deduplicator

0

Se l'ho letto correttamente, è necessario utilizzare nullptr per i puntatori gestiti e __nullptr per il puntatore non gestito. Tuttavia, dal momento che nullptr può essere utilizzato sia per un puntatore non gestito gestito, personalmente non vedo un motivo per utilizzare __nullptr.

+3

Ma, se si sta compilando con l'opzione/clr, come può sapere il compilatore se si sta utilizzando C++ 11 'nullptr' o C++/CLI' nullptr'? Non può, e questo è il motivo per cui * devi * usare '__nullptr' quando intendi la versione C++ 11 quando stai compilando con l'opzione/clr. –

+0

Il motivo per usare __nullptr è perché se si utilizza nullptr, allora ** non ** sarà mai in grado di attivare C++/CLI e utilizzare .NET. Il che è un grosso svantaggio in termini di utilizzo del codice legacy in futuro. – user3690202

Problemi correlati