C++ decltype(function_name)的返回类型完全无用? void foo(int a){ cout
您可以使用它声明与函数具有相同签名的函数对象:C++ decltype(function_name)的返回类型完全无用? void foo(int a){ cout,c++,function,declaration,decltype,C++,Function,Declaration,Decltype,您可以使用它声明与函数具有相同签名的函数对象: void (& f_ref)(int) = foo; void (* f_ptr)(int) = foo; cout<<is_same_v<decltype(foo), decltype(f_ref)><<endl; //return 0 cout<<is_same_v<decltype(foo), decltype(f_ptr)><<endl; //return
void (& f_ref)(int) = foo;
void (* f_ptr)(int) = foo;
cout<<is_same_v<decltype(foo), decltype(f_ref)><<endl; //return 0
cout<<is_same_v<decltype(foo), decltype(f_ptr)><<endl; //return 0
decltype(foo) df;
df = foo; //error: assignment of function ‘void df(int)’
df = &foo; //error: assignment of function ‘void df(int)’
decltype(foo) df{foo}; //error: function ‘void df(int)’ is initialized like a variable
decltype(foo) df{&foo}; //error: function ‘void df(int)’ is initialized like a variable
使用ffoo=::std::函数;
这完全是应该的。如果您编写了void(int)df;
,这显然是错误的。您试图用函数类型声明变量,这是没有意义的。唯一有意义的上下文是声明函数对象:auto bar=std::function;
现在,bar
是一个对象,它引用类型为void(int)
的函数(或类似函数的实例,如lambda)声明变量:
using ffoo = ::std::function<decltype(foo)>;
使用函数包装器:
decltype(foo)* pf = foo;
pf(42);
std::函数f=foo;
f(42);
decltype(函数名)的返回类型是否完全无用
绝对不是
void f1();
空f2(int);
void f3();
int main()
{
std::coutTwo是相同的吗?
在您的代码片段中被评估为0
,因为类型不同
dectype(foo)
是void(int)
(不是void foo(int)
,名称不是类型的一部分),
它不同于void(&)(int)
(类型f_ref
)和void(*)(int)
(类型f_ptr
)
这一行:
void f1();
void f2(int);
void f3();
int main()
{
std::cout << "f1 - f2 " << std::is_same<decltype(f1),decltype(f2)>::value << std::endl;
std::cout << "f1 - f3 " << std::is_same<decltype(f1),decltype(f3)>::value << std::endl;
}
不会编译,因为语法不允许在函数声明中使用初始值设定项
即使没有decltype
,它也无法工作:
decltype(foo) df{foo};
尽管您可以创建指向decltype(foo)
的指针:
这些线路:
decltype(foo) *df{foo}; // Becomes `void (*df)(int) {foo};`
不要编译,因为您无法为函数赋值。即使df
是void df(int);
,它也不会工作
我如何使用这种类型?
有无数的用途。例如,您可以使用它来创建指向上述函数的指针,也可以将其用作模板参数(用于std::function
或其他内容)。在此语句中
df = foo;
df = &foo;
没有意义。您不能分配函数
这些声明
df = foo;
df = &foo;
也没有道理
例如,可以在类中声明类型为decltype(foo)
的函数,然后定义它
这是一个演示程序
decltype(foo) df{foo};
decltype(foo) df{&foo};
考虑到在本声明中
Hello 0
Bye 1
1
1
函数指示符foo
被隐式转换为指向函数的指针。decltype()
的工作方式与您认为的不同。例如int a[5];decltype(a)b;
编译,即使int[5]b;
没有。因此,“decltype(foo)df;”实际上是声明一个函数,而不是一个变量;换句话说“decltype(foo)df;”等于“void df(int);”,对吗?@camino是的,它是。
cout<<is_same_v<decltype(foo), decltype(f_ref)><<endl;
cout<<is_same_v<decltype(foo), decltype(f_ptr)><<endl;
df = foo;
df = &foo;
decltype(foo) df{foo};
decltype(foo) df{&foo};
#include <iostream>
#include <type_traits>
void foo( int a )
{
std::cout << "Hello " << a << '\n';
}
struct A
{
decltype(foo) df;
};
void A::df( int a )
{
std::cout << "Bye " << a << '\n';
}
int main()
{
foo( 0 );
A a;
a.df( 1 );
void (& f_ref)(int) = foo;
void (* f_ptr)(int) = foo;
std::cout << std::is_same<decltype(&foo), decltype( f_ptr )>() << std::endl;
std::cout << std::is_same<decltype(foo), std::remove_reference_t<decltype( f_ref )>>() << std::endl;
return 0;
}
Hello 0
Bye 1
1
1
void (& f_ref)(int) = foo;