qual é o tipo de decltype (função) e por que eu não preciso "const" qualificador aqui?

votos
2

Estou confuso sobre o tipo de decltypeuma função. Não é nem um ponteiro de função nem functor. Como posso usá-lo? E por isso que a especialização de modelo completo aqui não requer constqualificação.

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

se eu remover o &, então ele se queixa de que

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

Olha, o decltype(std::hex)campo no parâmetro é deduzido a std::ios_base& (*)(std::ios_base&), enquanto ela é deduzido para std::ios_base&(std::ios_base&)no parâmetro de modelo.

Poderia, por favor me ajudar a entender isso?

Publicado 02/12/2019 em 23:56
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

std::hexé uma função, com a seguinte declaração (ver cppreference ):

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

Se Té o tipo de função, ou seja std::ios_base&(std::ios_base&), em seguida, uma vez que é um tipo de função, const Té a mesma que T. É por isso que a definição instanciação explícita pode ser escrita sem o const.

Note que se você remover a &partir da definição instanciação explícita, em seguida, o tipo de parâmetro função decltype(std::hex)sofre a transformação padrão de um tipo de função a um tipo de ponteiro de função. É por isso que você está vendo (*)na mensagem de erro.

Respondeu 03/12/2019 em 00:02
fonte usuário

votos
0

Para citar o padrão :

O efeito de um CV-qualificador de SEQ num Declarador função não é o mesmo que a adição de CV-qualificação no topo do tipo de função. Neste último caso, os CV-qualificadores são ignorados. [Nota: Um tipo de função que tem um CV-qualificador de SEQ não é um cv-qualificado tipo; não há CV-qualificado tipos de função. - nota final] [Exemplo:

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

- exemplo final]

Respondeu 03/12/2019 em 00:11
fonte usuário

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