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

时间:2016-01-15 12:43:27

标签: c++ c++11 typedef using

这些是一样的吗?

using on_receipt = void (const string);

typedef void on_receipt(const string);

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

2 个答案:

答案 0 :(得分:3)

是的,他们是:

  

[dcl.typedef]

     

2一个typedef-name也可以由a引入   别名声明。 using关键字后面的标识符变为   一个typedef-name和后面的可选attribute-specifier-seq   标识符附属于该typedef-name。它具有相同的语义   好像它是由typedef说明符引入的。特别是它   没有定义新类型。

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, "");
}

答案 1 :(得分:0)

你认为这是错误的。 on_receipt不是函数名称的&#34;占位符&#34;它是您介绍的类型名称。考虑一下使用情况。

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

我会说函数的typedef语法相当奇怪。在using样式中,您在一侧具有类型名称,而在另一侧具有定义它的事物。在typedef样式中,您将其交错。

typedef有点像功能声明,但它确实不是;它是一种类型声明。我觉得很乱。

哦,当然,这些陈述是等同的。