Sök…


Anmärkningar

  • En normal funktion är aldrig relaterad till en funktionsmall, trots samma namn, samma typ.
  • Ett normalt funktionssamtal och ett genererat funktionsmallsamtal är olika även om de delar samma namn, samma returtyp och samma argumentlista

Vad är en giltig funktionsmallöverbelastning?

En funktionsmall kan överbelastas under reglerna för överbelastning av icke-mallfunktioner (samma namn, men olika parametertyper) och dessutom är överbelastningen giltig om

  • Returtypen är annorlunda, eller
  • Listan med mallparametrar är annorlunda, med undantag för namngivning av parametrar och närvaron av standardargument (de ingår inte i signaturen)

För en normal funktion är det lätt att jämföra två parametertyper för kompilatorn, eftersom det har allt informat. Men en typ inom en mall kanske inte fastställts ännu. Därför är regeln för när två parametertyper är lika ungefärlig här och säger att de oberoende typerna och värdena måste matcha och stavningen av beroende typer och uttryck måste vara densamma (mer exakt måste de anpassa sig till så kallade ODR-regler), förutom att mallparametrar kan byta namn. Men om sådana olika stavningar anses två värden inom typerna vara olika, men kommer alltid att ge samma värden, är överbelastningen ogiltig, men ingen diagnostik krävs från kompilatorn.

template<typename T>
void f(T*) { }

template<typename T>
void f(T) { }

Detta är en giltig överbelastning, eftersom "T" och "T *" är olika stavningar. Men följande är ogiltigt, utan någon diagnostik krävs

template<typename T>
void f(T (*x)[sizeof(T) + sizeof(T)]) { }

template<typename T>
void f(T (*x)[2 * sizeof(T)]) { }


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow