以下内容在 gcc 和 clang 上均无法编译
#include <type_traits>
int foo();
int main()
{
using R = std::result_of_t<decltype(foo)()>; // error
}
两个编译器上的错误都涉及声明函数返回函数的非法性。但我并没有声明这样一个函数 - 我只是想编写它的类型 - 因为这就是
result_of
所期望的。这真的还是不规范吗?
您正在传递一个 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有趣的讨论)。