这些是一样的吗?
using on_receipt = void (const string);
typedef void on_receipt(const string);
这些不是函数指针的别名,而是实际的函数类型。他们都编译得很好。奇怪的是,typedef
版本至少具有函数名称的占位符,但由于using
在=
之前移动了这个占位符,因此返回和参数,看起来可能不正确或误导。
答案 0 :(得分:3)
是的,他们是:
[dcl.typedef]
2一个typedef-name也可以由a引入 别名声明。
using
关键字后面的标识符变为 一个typedef-name和后面的可选attribute-specifier-seq 标识符附属于该typedef-name。它具有相同的语义 好像它是由typedef
说明符引入的。特别是它 没有定义新类型。
#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, "");
}
答案 1 :(得分:0)
你认为这是错误的。 on_receipt
不是函数名称的&#34;占位符&#34;它是您介绍的类型名称。考虑一下使用情况。
你会像on_receipt function_variable;
一样使用它,所以你的解释实际上是误导性的,因为&#34; name&#34;你引用你的函数不是on_receipt
而是function_variable
。
我会说函数的typedef
语法相当奇怪。在using
样式中,您在一侧具有类型名称,而在另一侧具有定义它的事物。在typedef
样式中,您将其交错。
typedef
有点像功能声明,但它确实不是;它是一种类型声明。我觉得很乱。
哦,当然,这些陈述是等同的。