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)in 参数字段被扣除到std::ios_base& (*)(std::ios_base&),而它被扣除到std::ios_base&(std::ios_base&)模板的参数中。

你能帮我理解吗?

4

2 回答 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)会经历从函数类型到函数指针类型的标准转换。这就是您(*)在错误消息中看到的原因。

于 2019-12-02T21:02:30.723 回答
0

引用标准

函数声明器中cv-qualifier-seq的效果与在函数类型之上添加cv-qualification不同。在后一种情况下,将忽略cv 限定符。[ 注意:具有cv-qualifier-seq的函数类型不是cv-qualified类型;没有cv 限定的函数类型。— 尾注] [ 示例:

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

—结束示例]

于 2019-12-02T21:11:19.853 回答