这是否使用与此 typedef 相同的函数类型(不是指针)的别名

Is this using alias for a function type (not pointer) the same as this typedef

这些一样吗?

using on_receipt = void (const string);

typedef void on_receipt(const string);

这些不是函数指针的别名,而是实际的函数类型。他们都编译得很好。看起来奇怪的是 typedef 版本至少有函数名称的占位符,但是由于 using 将此占位符移动到 = 之前,因此 [=] 没有任何分隔符18=] 和参数,看起来可能不正确或具有误导性。

你想错了。 on_receipt 不是 "place holder for a function name" 它是您引入的类型名称。想想用法。

你会像 on_receipt function_variable; 一样使用它,所以你的解释实际上是误导,因为你引用函数的 "name" 不是 on_receipt,而是 function_variable .

我会说函数的 typedef 语法很奇怪。在 using 样式中,一侧是类型名称,另一侧是定义它的东西。在 typedef 样式中,它是交错的。

typedef 有点像函数声明,但实际上不是;这是一个类型声明。我觉得很乱。

哦,当然,那些说法是等价的。

是的,他们是:

[dcl.typedef]

2 A typedef-name can also be introduced by an alias-declaration. The identifier following the using keyword becomes a typedef-name and the optional attribute-specifier-seq following the identifier appertains to that typedef-name. It has the same semantics as if it were introduced by the typedef specifier. In particular, it does not define a new type.

Live Example

#include <string>
#include <type_traits>

int main()
{
    using on_receipt1 = void (const std::string);    
    typedef void on_receipt2(const std::string);
    static_assert(std::is_same<on_receipt1, on_receipt2>::value, "");
}