我可以编写一个返回函数的函数类型吗?

问题描述 投票:0回答:1

以下内容在 gcc 和 clang 上均无法编译

#include <type_traits>

int foo();

int main()
{
    using R = std::result_of_t<decltype(foo)()>; // error
}

两个编译器上的错误都涉及声明函数返回函数的非法性。但我并没有声明这样一个函数 - 我只是想编写它的类型 - 因为这就是

result_of
所期望的。这真的还是不规范吗?

c++ language-lawyer c++14 result-of
1个回答
10
投票

您正在传递一个 type-id,它在 [dcl.name] 中定义为

[…] 在语法上是该类型的变量或函数的声明,省略了实体的名称。 […] 如果构造是声明中的声明符,则可以唯一地标识“抽象声明符”中标识符出现的位置。命名类型与该类型的类型相同 假设的标识符。 为了使假设的标识符具有某种类型,假设的声明首先必须是格式良好的。但它并不符合

[dcl.fct]/10
。因此,该程序的格式不正确(并且编译器的错误消息实际上是可以理解的)。这种情况也更直接地被

[temp.deduct]/(8.10) 覆盖,这意味着这是一个(SFINAE 友好的)错误。 事实上,仅仅暗示无效类型的使用就足以使程序格式错误。例如。创建指向函数返回函数的类型指针的格式不正确:


using f = int(); using t = f(*)();

以下内容也是如此:

struct A {virtual void f() = 0;}; using t = A(*)();

(Clang 不应该接受这一点。C.f. GCC bug
17232
有趣的讨论)。

© www.soinside.com 2019 - 2024. All rights reserved.