我对函数的 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&)
。
你能帮我理解一下吗?
最佳答案
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)
会经历函数类型的标准转换到函数指针类型。这就是您在错误消息中看到 (*)
的原因。
关于c++ - decltype(function) 的类型是什么?为什么我不需要 "const"限定符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59146528/