C++ 按值(?)而不是按函数指针传递函数?

C++ 按值(?)而不是按函数指针传递函数?,c++,function,templates,c++11,C++,Function,Templates,C++11,抱歉,如果以前有人问过这个问题,但我找不到 因此,我试图让自己了解模板和新的C++11特性(主要是lambdas,这是我在其他语言中一直喜欢的东西) 但是在我的测试中,我发现了一些我不知道它是如何工作的东西,我试图理解它是如何工作的,但无法理解它 以下代码: template <class Func> void Test( Func callback ) { callback( 3 ); } void Callback( int i ) { std::cout &l

抱歉,如果以前有人问过这个问题,但我找不到

因此,我试图让自己了解模板和新的C++11特性(主要是lambdas,这是我在其他语言中一直喜欢的东西)

但是在我的测试中,我发现了一些我不知道它是如何工作的东西,我试图理解它是如何工作的,但无法理解它

以下代码:

template <class Func>
void Test( Func callback ) {
    callback( 3 );
}

void Callback( int i ) {
    std::cout << i << std::endl;
}

int main( int argc, char** argv ) {
    Test( &Callback ); // this I was expecting to work, compiler will see its a pointer to a function
    Test( Callback ); // this also works, but how?!
    return 0;
}
模板
无效测试(Func回调){
回调(3);
}
无效回调(int i){

std::cout函数可以隐式转换为指向自身的指针;这种转换几乎在任何地方都会发生。
Test(Callback)
Test(&Callback)
完全相同。没有区别。在这两种情况下,
Func
都被推断为
void(*)(int)


函数指针很奇怪,在C++中,可以在

中发现更多的函数,函数不是一级对象,意思是“函数为值”。没有任何意义。这就是为什么函数名总是隐式转换为指向它的指针。

函数隐式转换为函数指针。如果事实上无法获取函数值或引用。尽管奇怪的是,您可以创建函数值类型,但您无法为其分配任何内容

这说明了LAMBDAS和各种回调如何与模板发生反应。

< P>在C++ 11中(以及Boost和Tr1),我们有STD::For函数作为存储函数、lambda和函数的模板类型。因此,您可以在函数中保持一个函数类型的概念,即STD::函数。这意味着其中没有存储任何函数(引用),因此无法调用它


最初的问题涉及到C,C++允许函数引用。此外,由于C语言的兼容性原因,函数名可以退化为函数指针。但是,由于重载,C++中的“事物”比C.

更有趣。确实有意义。谢谢你的回答。因此,如果我没有使用模板和声明测试,比如:void Test(void(*callback)(int)){…},两个调用都会工作。知道这一点很好。我会确保我读了你链接的线程。这是错误的。函数引用很好。如果
Test
声明为
void Test(Func&callback)
,则
Func
将被推断为
void(int)
回调
将通过引用传递到
测试
。哇!我想应该支持引用和指针,因为它们非常相似。是否可以声明函数值并为其赋值?@deft我不知道这是什么意思。什么是“函数值”?