拥有std :: is_function实现

时间:2014-12-21 22:04:27

标签: c++ stl

建议here以下列方式实施:

template<class Ret, class... Args>
struct is_function<Ret(Args...)const> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...)volatile> : std::true_type {};

但它是一个有效的函数语法吗? Visual Studio 2013出错:

error C2270: 'abstract declarator' : modifiers not allowed on nonmember functions   

1 个答案:

答案 0 :(得分:3)

函数参数之后的constvolatile称为cv-qualifier-seq。 C ++ 14标准的第8.3.5节第6节说:

  

具有cv-qualifier-seq或ref-qualifier的函数类型(包括   由typedef-name(7.1.3,14.1)命名的类型只能出现:

     

- 非静态成员函数的函数类型

     

- 指向成员的指针引用的函数类型,

     

- 函数typedef声明或别名声明的顶级函数类型

     

- type-parameter(14.1)的默认参数中的type-id,或

     

- type-parameter(14.3.1)的template-argument的type-id。

在您的示例中,Ret(Args...)constRet(Args...)volatile符合最后一种情况。