jaký je typ decltype (funkce) a proč nepotřebuji „const“ kvalifikátoru tady?

hlasů
2

Jsem zmaten, jaký typ decltypefunkce. Není to ani ukazatel funkce ani functor. Jak ji mohu používat? A proč plné šablony specializace zde nevyžaduje constkvalifikace.

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

kdybych odstranit &, ale pak si stěžuje, ž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

Look se decltype(std::hex)v parametru pole odečtena std::ios_base& (*)(std::ios_base&), zatímco je odečtena std::ios_base&(std::ios_base&)v parametru šablony.

Mohl byste prosím, pomozte mi to pochopit?

Položena 02/12/2019 v 23:56
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

std::hexje funkce, s tímto prohlášením (viz cppreference ):

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

Jestliže Tje typ této funkce, a to std::ios_base&(std::ios_base&), pak proto, že je typ funkce, const Tje stejné jako T. To je důvod, proč explicitní definice instance lze zapsat bez const.

Všimněte si, že pokud jste odstranit &z explicitní definice instance, pak typ parametru funkce decltype(std::hex)podstupuje standardní přeměnu z funkčního typu na typ ukazatel funkce. To je důvod, proč jste vidět (*)v chybové zprávě.

Odpovězeno 03/12/2019 v 00:02
zdroj uživatelem

hlasů
0

Citovat standard :

Účinek cv-kvalifikace-seq v funkce declarator není totéž jako přidání cv-kvalifikaci v horní části typu funkce. V posledně jmenovaném případě se CV-kvalifikátory jsou ignorovány. [Poznámka: typ funkce, která má CV-kvalifikátor-seq není CV-kvalifikovaný typu; nejsou k dispozici žádné CV-kvalifikovaný typy funkcí. - end note] [Příklad:

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

- konec příklad]

Odpovězeno 03/12/2019 v 00:11
zdroj uživatelem

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