передать функцию по значению (?) вместо указателя функции?

Извините, если об этом спрашивали раньше, но я не смог его найти.

] Итак, я пытаюсь изучить шаблоны и новые возможности C ++ 11 (в основном лямбды, которые мне всегда нравились на других языках).

Но в моих тестах я обнаружил то, о чем я понятия не имел, что это работает, и я Я пытаюсь понять, как это работает, но не могу понять ..

Следующий код:

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;
}

Если я понимаю, как работают шаблоны, в основном это схема, по которой компилятор знает, что строить, поэтому первый call Test (& Callback); Я ожидал, что сработает, потому что компилятор увидит, что шаблон получает адрес функции, и предположит, что аргументы должны быть указателем.

Но что такое второй вызов? предполагаемый шаблон? Копия функции (если это вообще имеет смысл)?

10
задан Xeo 19 December 2011 в 00:22
поделиться