что тип decltype (функция) и почему мне не нужно «Уста» Классификатор здесь?

голоса
2

Я смущен типа decltypeфункции. Это не указатель на функцию , ни функтор. Как я могу его использовать? И почему полная специализация шаблона здесь не требуется constклассификатор.

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

если удалить &, то тогда жалуется , что

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

Смотри, decltype(std::hex)в параметре поле вычитаться std::ios_base& (*)(std::ios_base&), в то время как она вычитается std::ios_base&(std::ios_base&)в параметре шаблона.

Не могли бы вы помочь мне понять это?

Задан 02/12/2019 в 23:56
источник пользователем
На других языках...                            


2 ответов

голоса
2

std::hexэто функция, с помощью следующей декларации (см cppreference ):

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

Если Tтип этой функции, а именно std::ios_base&(std::ios_base&), то , поскольку он представляет собой тип функции, const Tтакой же , как T. Поэтому явное определение экземпляра может быть записано без const.

Обратите внимание , что если вы удалите &из явного определения экземпляра, то типа параметра функции decltype(std::hex)проходит стандартное преобразование из типа функции к типу указателя на функцию. Вот почему вы видите (*)в сообщении об ошибке.

Ответил 03/12/2019 в 00:02
источник пользователем

голоса
0

Приведу стандарт :

Эффект CV-классификатор-SEQ в функции описателя не то же самое , как добавление CV-квалификацию в верхней части типа функции. В последнем случае CV-отборочные игнорируются. [Примечание: тип функции , которая имеет CV-квалификатор-SEQ не резюме квалифицированных типа; нет резюме квалифицированных типов функций. - конец примечание] [Пример:

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

- конечный пример]

Ответил 03/12/2019 в 00:11
источник пользователем

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