jaki jest rodzaj decltype (funkcja) i dlatego nie ma potrzeby „const” kwalifikator tutaj?

głosy
2

Jestem mylić z rodzaju decltypefunkcji. To nie jest ani wskaźnik funkcji ani funktor. Jak mogę go używać? I dlaczego pełny szablon specjalizacji tutaj nie wymaga constkwalifikator.

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

Jeśli usunąć &, to potem narzeka, że

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

Wygląd, decltype(std::hex)pole parametru odlicza się std::ios_base& (*)(std::ios_base&), podczas gdy odlicza się std::ios_base&(std::ios_base&)w parametrze szablonu.

Czy mógłbyś mi pomóc zrozumieć to?

Utwórz 02/12/2019 o 23:56
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
2

std::hexJest to funkcja, z następującym oświadczeniem (patrz cppreference ):

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

Jeśli Tjest typ tej funkcji, a mianowicie std::ios_base&(std::ios_base&), to dlatego, że jest to rodzaj funkcji, const Tjest taka sama jak T. Dlatego wyraźne określenie instancji może być napisany bez const.

Zauważ, że jeśli usunąć &z wyraźnej definicji konkretyzacji, to typ parametru funkcja decltype(std::hex)przechodzi transformację od standardowego typu funkcji w rodzaju wskaźnik funkcji. Dlatego widzisz (*)w komunikacie o błędzie.

Odpowiedział 03/12/2019 o 00:02
źródło użytkownik

głosy
0

Cytować standard :

Efekt CV kwalifikatora seq w declarator funkcja nie jest taka sama, jak dodawanie CV kwalifikacje w górnej typu funkcji. W tym ostatnim przypadku, CV-kwalifikacyjne są ignorowane. [Uwaga: Typ funkcja ma CV kwalifikatora SEQ nie jest to odmiana wykwalifikowana typu; nie istnieją żadne cv wykwalifikowany typy funkcyjne. - koniec uwaga] [przykład:

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

- przykład end]

Odpowiedział 03/12/2019 o 00:11
źródło użytkownik

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