在尝试实现时,std::is_function我遇到了VC++和libc ++不同意的情况.
static_assert(std::is_function<int()volatile &>::value, "Not function");
Run Code Online (Sandbox Code Playgroud)
libc ++接受这个.VC++失败,声称它不是一个函数.谁是对的?
在20.9.4.1(表47)中,它说:
template <class T> struct is_function;
T is a function type (3.9.2)
Run Code Online (Sandbox Code Playgroud)
短语"功能类型"没有明确指定为"整数类型".我很难找到它的确切含义.哪些段落准确指出"功能类型"的含义?
[dcl.fct]/1-3:
1在具有表格的声明
T D中D
D1(parameter-declaration-clause)cv-qualifier-seq opt ref-qualifier opt exception-specification opt attribute-specifier-seq opt和所含的类型说明符-ID中的声明
T D1是" 衍生的说明符类型列表T",在d的声明符-ID的类型是" 衍生的说明符类型列表的功能(参数声明子句)cv-qualifier-seq opt ref-qualifier opt returnT".可选的attribute-specifier-seq属于函数类型.2在具有表格的声明
T D中D
D1(parameter-declaration-clause)cv-qualifier-seq opt ref-qualifier opt exception-specification opt attribute-specifier-seq opt trailing-return-type和包含的类型说明符-ID的声明
T D1是" 导出声明符类型列表T",T应为单一 类型说明符auto.的类型的说明符-ID中D是" 衍生的说明符类型列表的(功能参数声明子句)CV-限定符-SEQ 选择 REF-限定符选择返回U,其中"U是由指定的类型拖尾return-类型.可选的 attribute-specifier-seq属于函数类型.3任何一种形式都是一种功能类型.
第3段定义了术语功能类型(注意斜体).函数类型可以具有cv-qualifier-seq和/或ref-qualifier.实际上,[dcl.fct]/6明确地解决了这些"特殊"函数类型:
具有cv-qualifier-seq或ref-qualifier (包括由typedef-name(7.1.3,14.1)命名的类型)的函数类型应仅显示为:
- 非静态成员函数的函数类型,
- 指向成员的指针引用的函数类型,
- 函数typedef声明或别名声明的顶级函数类型,
- type-parameter(14.1)的默认参数中的type-id,或
- 的类型ID一个的模板的参数为一个类型参数(14.3.1).
换句话说,std::is_function<int()volatile &>::value应该是true.如果MSVC另有声明,则不符合要求.