使用别名的功能

时间:2014-06-24 12:23:29

标签: c++ c++11 using

以下代码究竟是什么声明的;

using f1 = void(int);

我知道以下内容;

using f2 = void(*)(int);
using f3 = void(&)(int);

f2是指向函数的指针,f3将是引用。

2 个答案:

答案 0 :(得分:4)

它是什么?

这是功能类型。声明函数时,例如:

void func(int);

它的类型不是指针也不是引用。上述函数的类型为void(int)

我们可以通过使用 type traits 来“证明”它,如下所示:

void func(int) {}

int main() {
    std::cout << std::is_same<decltype(func), void(int)>::value << '\n';
    std::cout << std::is_same<decltype(func), void(*)(int)>::value << '\n';
    std::cout << std::is_same<decltype(func), void(&)(int)>::value << '\n';
}

Live demo

以上代码仅针对第一行返回true

它与指针或引用相同吗?

不,但函数左值可以按照以下方式隐式转换为函数指针:

  

§4.3/ 1函数到指针的转换[conv.func]

     

函数类型T的左值可以转换为“指向T的指针”的prvalue。结果是指向函数的指针。

函数类型A(Args...)与其引用(即A(&)(Args...))之间的关系与任何类型T及其引用(即T&之间的关系基本相同)。

它在哪里使用?

它通常用作模板参数。

例如std::function将函数类型存储在std::function对象中,您可以使用以下函数声明这样的对象:

std::function<void(int)> fn;

答案 1 :(得分:3)

它声明f1是一个函数类型,带有int参数且没有返回类型。

这相当于老派宣言

typedef void f(int);