wat is de aard van de decltype (functie) en waarom heb ik niet nodig "const" qualifier hier?

stemmen
2

Ik ben in de war van het type van decltypeeen functie. Het is noch een functie pointer noch functor. Hoe kan ik het gebruiken? En waarom de volledige sjabloon specialisatie hier niet nodig constqualifier.

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)
{}

als ik het verwijderen &, klaagt dan is dat

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

Kijk, het decltype(std::hex)is veld in parameter afgetrokken std::ios_base& (*)(std::ios_base&), terwijl het wordt in mindering gebracht op std::ios_base&(std::ios_base&)in de parameter van template.

Kunt u me helpen begrijpen behagen?

De vraag is gesteld op 02/12/2019 om 23:56
bron van user
In andere talen...                            


2 antwoorden

stemmen
2

std::hexis een functie met onderstaande verklaring (zie cppreference ):

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

Als Thet type van deze functie, namelijk std::ios_base&(std::ios_base&), omdat dan een functietype, const Tis gelijk T. Dit is de reden waarom de expliciete concretisering definitie kan worden geschreven zonder const.

Merk op dat als u het verwijderen &van de expliciete concretisering definitie, dan is het type functie parameter decltype(std::hex)ondergaat de standaard transformatie van een functie type om een functie pointer type. Dit is de reden waarom u ziet (*)in de foutmelding.

antwoordde op 03/12/2019 om 00:02
bron van user

stemmen
0

Citeren de standaard :

Het effect van een cv-qualifier-seq in een functie declarator is niet hetzelfde als het toevoegen cv-kwalificatie bovenop het functietype. In het laatste geval, de cv-qualifiers worden genegeerd. [Noot: Een functietype dat heeft cv-qualifier-seq geen cv-gekwalificeerd type; zijn er geen cv-gekwalificeerde functie types. - eindnoot] [Voorbeeld:

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

- end voorbeeld]

antwoordde op 03/12/2019 om 00:11
bron van user

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