Tilordne funksjon til funksjonspeker, const argument korrekthet?

 C Programming >> C C# Program >  >> Tags >> Function
Tilordne funksjon til funksjonspeker, const argument korrekthet?

I henhold til C++-standarden (C++ 17, 16.1 Overloadable erklæringer)

Så i prosessen med å bestemme funksjonstypen, forkastes kvalifikatoren const for eksempel av den andre parameteren i funksjonsdeklarasjonen nedenfor.

void mystery7(int a, const double b);

og funksjonstypen er void( int, double ) .

Vurder også følgende funksjonserklæring

void f( const int * const p );

Det tilsvarer følgende erklæring

void f( const int * p );

Det er den andre const som gjør parameteren konstant (det vil si at den erklærer selve pekeren som et konstant objekt som ikke kan tilordnes på nytt inne i funksjonen). Den første const definerer pekerens type. Den er ikke forkastet.

Vær oppmerksom på at selv om det i C++-standarden er brukt begrepet "const reference" referanser i seg selv kan ikke være konstant motsatte av pekere. Det er følgende erklæring

int & const x = initializer;

er feil.

Mens denne erklæringen

int * const x = initializer;

er korrekt og erklærer en konstant peker.


Det er en spesiell regel for funksjonsargumenter som sendes av verdi.

Selv om const på dem vil påvirke bruken deres inne i funksjonen (for å forhindre ulykker), det er i utgangspunktet ignorert på signaturen. Det er fordi const nheten til et objekt som sendes av verdi har ingen som helst effekt på originalen som er kopiert fra objektet på anropsstedet.

Det er det du ser.

(Personlig tror jeg at denne designbeslutningen var en feil; det er forvirrende og unødvendig! Men det er det det er. Legg merke til at det kommer fra den samme passasjen som stille endrer void foo(T arg[5]); til void foo(T* arg); , så det er mye tull som vi må forholde oss til!)

Husk imidlertid at dette ikke bare sletter noen const i et slikt argument. I int* const pekeren er const , men i int const* (eller const int* ) pekeren er ikke-const men er til en const ting. Bare det første eksemplet gjelder const selve pekeren og vil bli fjernet.