c++ - decltype(function) 的类型是什么?为什么我不需要 "const"限定符?

标签 c++ templates metaprogramming template-specialization explicit-specialization

我对函数的 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 TT 相同。这就是为什么可以在没有 const 的情况下编写显式实例化定义。

请注意,如果从显式实例化定义中删除 &,则函数参数类型 decltype(std::hex) 会经历函数类型的标准转换到函数指针类型。这就是您在错误消息中看到 (*) 的原因。

关于c++ - decltype(function) 的类型是什么?为什么我不需要 "const"限定符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59146528/

相关文章:

Ruby元编程,定义多个 "inherited"函数

ruby - Ruby 中的 Open 类与 Groovy 中的 MOP 的作用域

c++ - 具有棘手的 lambda 表达式的奇怪未定义行为

c++ - 如何在 linux 中获取 C++ 中的接口(interface)列表?

c++ - 奇怪地相互重复的类定义

c++ - 编译时的类型特化

c++ - C++中的引用返回——引用赋值与值赋值

c++ - 使用 `std::cin` 从用户那里准确读取 4 个字符到字符数组中

c++ - VS2008 外部模板

c++ - 什么是 MPL 值习语?