我可以编写返回函数的函数类型吗?
Can I write a function type that returns a function?
以下内容无法在 gcc 和 clang 上编译
#include <type_traits>
int foo();
int main()
{
using R = std::result_of_t<decltype(foo)()>; // error
}
两个编译器上的错误都涉及声明返回函数的函数的非法性。但我不是在声明这样的函数 - 我只是想写它的类型 - 因为这是result_of
期望的。这真的还是畸形的吗?
您正在传递一个类型 ID,该 ID 在 [dcl.name] 中定义为
[...]语法上是该类型的变量或函数的声明,省略了实体的名称。[...]如果构造是声明中的声明符,则可以唯一标识抽象声明符中标识符出现的位置。然后,命名类型与 假设标识符。
要使假设标识符具有某种类型,假设声明必须首先格式正确。但它不是按照[dcl.fct]/10。因此,程序格式不正确(编译器的错误消息实际上是可以理解的)。这种情况也更直接地被 [temp.deduc]/(8.10) 覆盖,这意味着这是一个(SFINAE 友好的)错误。
事实上,仅仅暗示无效类型的用法就足以使程序格式错误。 例如,创建指向函数返回函数的类型指针格式不正确:
using f = int();
using t = f(*)();
如下:
struct A {virtual void f() = 0;};
using t = A(*)();
(Clang不应该接受这一点。 C.f. GCC bug 17232 的有趣讨论)。
相关文章:
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- 关于 C++ 中的函数类型定义
- 用于检测函数类型是否为否的特征
- 函数类型参数的模板参数推导
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- C++无效的函数类型转换
- STL 函数和函数类型与函数指针类型
- 如何将result_of与函数类型定义一起使用
- 将模板(没有规范)传递给 std::thread() 会出现错误:<未解析的重载函数类型>匹配错误
- C++ 编译错误:gnu_printf是无法识别的格式函数类型
- 专门用于"direct"函数类型(与函数指针类型相对)
- 将函数类型作为模板参数传递不会编译
- 通过参数传递 lambda(无函数类型模板)
- 如何在模板参数中分离函数类型返回类型和参数
- 为什么比较函数类型需要指定为模板参数?
- 带有限定符的函数类型定义用例
- 如何声明对函数类型的常量引用
- 非类型模板参数允许各种函数类型?