以下代码究竟是什么声明的;
using f1 = void(int);
我知道以下内容;
using f2 = void(*)(int);
using f3 = void(&)(int);
f2
是指向函数的指针,f3
将是引用。
答案 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';
}
以上代码仅针对第一行返回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);