Programmiersprache C++26: Vereinfachter Umgang mit Pointer-Adressen
Die Anzeige der Adresse eines beliebigen Zeigers in C++ 20 schlägt fehl, ist aber mit C++26 erfolgreich.
(Bild: Piyawat Nandeenopparit / Shutterstock.com)
- Rainer Grimm
Mit C++26 ist es möglich, die Adresse eines beliebigen Zeigers auszugeben.
C++20
Nur die Zeigertypen void, const void und std::nullptr_t sind gültig. Wer die Adresse eines beliebigen Zeigers anzeigen möchte, muss ihn in (const) void* umwandeln.
// formatPointer20.cpp
#include <format>
#include <iostream>
#include <string>
int main() {
double d = 123.456789;
//std::cout << "&d" << std::format("{}", &d) << '\n';
std::cout << "static_cast<void *>(&d): " << std::format("{}", static_cast<void *>(&d)) << '\n';
std::cout << "static_cast<const void *>(&d): " << std::format("{}", static_cast<const void *>(&d)) << '\n';
std::cout << "nullptr: " << std::format("{}", nullptr) << '\n';
}
In der main-Funktion wird eine double-Variable namens d mit dem Wert 123,456789 initialisiert. Die Funktion std::format stellt die Adresse dar.
In der ersten auskommentierten Zeile wird versucht, die Adresse von d direkt mit std::format(„{}“, &d) auszugeben. Diese Zeile ist auskommentiert, weil sie zu einem Kompilierungsfehler führen würde. Die Funktion std::format erfordert, dass der Zeiger in void* oder const void* umgewandelt wird, um ihn korrekt zu formatieren.
Die nächsten drei Zeilen zeigen, wie Zeiger mit std::format korrekt formatiert und ausgegeben werden. In der ersten dieser Zeilen wird die Adresse von d nach der Umwandlung in void* ausgegeben. In der zweiten Zeile wird die Adresse von d nach der Umwandlung in const void* ausgegeben. In der dritten Zeile wird der Wert nullptr ausgegeben, der einen Null-Zeiger darstellt.
Hier ist die Ausgabe des Programms:
Bei Aktivierung der auskommentierten Zeile erscheint eine lange Fehlermeldung.
C++26
Mit C++26 kann man den Zeiger direkt ausgeben:
// formatPointer26.cpp
#include <format>
#include <iostream>
#include <string>
int main() {
double d = 123.456789;
double* p = &d;
std::cout << "&d" << std::format("{:P}", p) << '\n';
}
Offen gestanden lässt sich das Programm nicht kompilieren. Dies widerspricht der Compiler-Unterstützung für C++26 und dem Proposal P2510R3. Warum das so ist, verrate ich in meinem nächsten Beitrag.
Wie geht es weiter?
Concurrency wird mit C++26 zwei nette Features fĂĽr Lock-freie Datenstrukturen erhalten: Read-Copy Update und Hazard Pointers. (rme)