Forum: PC-Programmierung C++ remove_pointer und const correctness


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Sprachloser Dude (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Warum entfernt der folgende Code nicht nur den Pointer sondern auch das 
const?
# include <iostream>
using std :: cout;
using std :: endl;
# include <typeinfo>
# if 201103L <= __cplusplus
#  include <type_traits>
using std :: remove_pointer;
# else
template <typename T>
struct remove_pointer {
        typedef T type;
};
template <typename T>
struct remove_pointer <T*>{
        typedef T type;
};
# endif
int main () {
        cout << typeid (int) . name () << endl;
        cout << typeid (int*) . name () << endl;
        cout << typeid (int const*) . name () << endl;
        cout << typeid (remove_pointer <int> :: type) . name () << endl;
        cout << typeid (remove_pointer <int*> :: type) . name () << endl;
        cout << typeid (remove_pointer <int const*> :: type) . name () << endl;
}
% g++ -std=c++98 -pedantic -otest test.cpp
% c++filt -t `./test`
int
int*
int const*
int
int
int
% g++ -std=c++20 -pedantic -otest test.cpp
% c++filt -t `./test`                     
int
int*
int const*
int
int
int

von Rolf M. (rmagnus)


Bewertung
1 lesenswert
nicht lesenswert
Er entfernt es nicht, sondern das const ist einfach nicht Teil der 
typeid.
Füge einfach mal
        cout << typeid (int const) . name () << endl;
hinzu.

: Bearbeitet durch User
von Sprachloser Dude (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Rolf M. schrieb:
> Er entfernt es nicht, sondern das const ist einfach nicht Teil der
> typeid.

Danke, das wusste ich noch gar nicht, dass sich Typeid und Traits da 
unterscheiden.

[code]
$ cat test.cxx
# include <iostream>
using std :: cout;
using std :: endl;
# include <typeinfo>
# include <type_traits>
using std :: is_same;
int main () {
        cout << is_same <int, int const> :: value << endl;
        cout << (typeid (int) == typeid (int const)) << endl;
}
$ c++ test.cxx && ./a.out
0
1
[code]

von mh (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Falls du es noch nicht kennst, solltest du dir _PRETTY_FUNCTION_ 
angucken.
Dieses "Makro" ist sehr hilfreich, im beim Loggen von Debuginfos und 
generell beim Umgang mit Templates. Vor allem das folgende Beispiel ist 
sehr hiflreich, wenn man mal keine Lust hat über type deduction 
nachzudenken:
#include <iostream>
#include <type_traits>

template<typename T>
void foo() {
    std::cout << __PRETTY_FUNCTION__ << std::endl;
}

int main () {
        foo<int>();
        foo<int*>();
        foo<int const*>();
        foo<std::remove_pointer<int>::type>();
        foo<std::remove_pointer<int*>::type>();
        foo<std::remove_pointer<int const*>::type>();
}

liefert
void foo() [T = int]
void foo() [T = int *]
void foo() [T = const int *]
void foo() [T = int]
void foo() [T = int]
void foo() [T = const int]

Mindestens gcc und clang kennen _PRETTY_FUNCTION_.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.