这是否使用与此 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.
#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, "");
}
这些一样吗?
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 thetypedef
specifier. In particular, it does not define a new type.
#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, "");
}