在尝试实现std::is_function
时,我遇到了VC ++和libc ++不同意的情况。
static_assert(std::is_function<int()volatile &>::value, "Not function");
libc ++接受这个。 VC ++失败,声称它不是一个函数。谁是对的?
在20.9.4.1(表47)中,它说:
template <class T> struct is_function;
T is a function type (3.9.2)
短语“功能类型”未明确指定为“整数类型”。我很难找到它的确切含义。哪些段落准确指出“功能类型”的含义?
答案 0 :(得分:8)
[dcl.fct] / 1-3:
1在声明
T D
中,D
的格式为
D1
( parameter-declaration-clause ) cv-qualifier-seq opt ref-qualifier opt 例外规范 opt attribute-specifier-seq opt以及声明
T D1
中包含的 declarator-id 的类型 是“ derived-declarator-type-listT
”,类型 D中的declarator-id是“ derived-declarator-type-list 的函数 ( parameter-declaration-clause ) cv-qualifier-seq opt ref-qualifier opt 返回T
“。可选的 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 尾返回型并且声明
T D1
中包含的 declarator-id 的类型是“ derived-declarator-type-listT
”,T
应该是唯一的 type-specifierauto
。D
中 declarator-id 的类型是“ derived-declarator-type-list 函数 ( parameter-declaration-clause ) cv-qualifier-seq opt ref-qualifier opt 返回U
“,其中U
是 trailing-return-type 指定的类型。可选的 attribute-specifier-seq 属于函数类型。3任何一种形式的类型都是函数类型。
第3段定义术语函数类型(注意斜体)。函数类型可以包含 cv-qualifier-seq 和/或 ref-qualifier 。实际上,[dcl.fct] / 6明确地解决了这些&#34;特殊&#34;功能类型:
具有 cv-qualifier-seq 或 ref-qualifier 的函数类型 (包括由 typedef-name (7.1.3,14.1)命名的类型)将出现 仅作为:
- 非静态成员函数的函数类型
- 指向成员的指针引用的函数类型
- 函数typedef声明的顶级函数类型或 alias-declaration ,
- type-id 在 type-parameter (14.1)的默认参数中,或
- type-parameter 的 type-id type-parameter (14.3.1)。
换句话说,std::is_function<int()volatile &>::value
应为true
。如果MSVC另有声明,则不符合要求。