mi az a típusú decltype (funkció), és miért nem kell „const” minősítő itt?

szavazat
2

Zavarban vagyok az a fajta decltypefüggvényében. Ez nem egy függvény pointer sem funktorhoz. Hogyan kell használni? És hogy miért a teljes template specializáció itt nem igényel constselejtezőn.

class SomeClass
{
public:
    template <typename T>
    void insideTemplateMethod(const T & value)
    {
    }
};
template
void SomeClass::insideTemplateMethod<decltype(std::hex)>(decltype(std::hex) & ); // no need to specify const

template
void SomeClass::insideTemplateMethod<int>(int &); // error, must specify const

int main(void)
{}

ha leveszem a &, ez aztán panaszkodik, hogy

error: template-id 'insideTemplateMethod<std::ios_base&(std::ios_base&)>' for 'void SomeClass::insideTemplateMethod(std::ios_base& (*)(std::ios_base&))' does not match any template declaration

Nézd, az decltype(std::hex)a paraméter mező levont std::ios_base& (*)(std::ios_base&), mivel a levont std::ios_base&(std::ios_base&)a paraméter sablon.

Segítene, kérem megérteni?

A kérdést 02/12/2019 23:56
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
2

std::hexegy olyan funkció, az alábbi nyilatkozatot (lásd cppreference ):

std::ios_base& hex( std::ios_base& str );

Ha Taz a fajta ezt a funkciót, nevezetesen std::ios_base&(std::ios_base&), akkor azért, mert ez egy függvény típusú, const Tazonos T. Ez az oka annak explicit példányosıtási meghatározás írhatók nélkül const.

Megjegyezzük, hogy ha kiveszi a &az explicit példányosítását definíciót, majd a függvény paraméter típus decltype(std::hex)megy a standard átalakulás egy függvény típus függvényében mutató típusú. Ez az oka annak látsz (*)a hibaüzenet.

Válaszolt 03/12/2019 00:02
a forrás felhasználó

szavazat
0

Idéznék a standard :

A hatás egy cv-selejtező-Seq egy funkció declarator nem ugyanaz, mint hozzá cv-minősítési tetején a funkció típust. Az utóbbi esetben a cv-selejtező figyelmen kívül hagyja. [Megjegyzés: A funkció típust, hogy van egy CV-selejtező-Seq nem egy cv-minősített típusú; nincsenek cv képzett függvény típusok. - end Megjegyzés] [Példa:

typedef void F();
struct S {
    const F f;        // OK: equivalent to: void f();
};

- end például]

Válaszolt 03/12/2019 00:11
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more