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;