Я освежаю некоторые С++ 11, и мне немного трудно что-то понять.
std::function
позволяет мне передавать любой тип Callable как объект функции. Я знаю, что он делает и как его использовать.
void foo(int a, int b) {}
std::function<void (int, int)> bar = foo;
...
bar
— это вызываемый объект, целью которого является foo
, функция, которая принимает два целых числа в качестве параметров.
Чего я не понимаю, так это того, что означает void (int, int)
...
- Я знаю, что это параметр шаблона, который я передаю компилятору.
- Я знаю, что из него компилятор интерпретирует, что вызываемый тип должен принимать два целых числа и возвращать void.
Но void (int, int)
, похоже, не "называет тип".
void (*)(int, int)
— это указатель на функцию, возвращающую void, которая принимает два целых числа.void (Foo*::)(int, int)
— это указатель на функцию Foo, возвращающую void, которая принимает два целых числа.
На самом деле следующий игрушечный фрагмент компилируется нормально.
class Foo {};
int main(int, char**)
{
void (*)(int, int);
void (Foo*::)(int, int);
}
Но добавление выражения void (int, int)
вызывает ошибку времени компиляции.
Я еще немного покопался, прежде чем опубликовать свой вопрос. Компилируется следующий фрагмент кода:
class Foo {};
template <typename T>
struct Bar
{
typedef T type;
};
void a(int b, int c) {}
int main(int, char**)
{
void (*)(int, int);
void (Foo::*)(int, int);
Bar<int (int, int)> bar;
}
Но попытка использовать Bar::type
каким-либо образом приводит к другой ошибке: "недопустимо объявленный тип функции".
TLDR: что именно означает выражение void (int, int)
и почему это допустимый параметр шаблона?
Спасибо за любую помощь, которую вы можете отправить мне.
g++ test.cpp -o test
, без флагов и прочего. - person JDR   schedule 11.06.2015-std=c++11 -pedantic -Wall -Wextra
, чтобы указать версию стандарта, которой он должен следовать, и предупредить о нестандартных расширениях, которые он принимает. - person dyp   schedule 11.06.2015void (*)(int, int)
называет тип и что это указатель на что-то. Как бы вы назвали тип объекта, на который он указывает? - person David Schwartz   schedule 11.06.2015void(int,int)
на самом деле не является сигнатурой функции, поскольку сигнатура (не шаблонных) функций не содержит тип возвращаемого значения;) (Это делает меня очень педантичным, я думаю.) Его можно назвать типом функции, поскольку это тип функции. Вы даже можете объявить, но не определять функцию, используя тип функции. Например.using FT = void(int); FT myFunc; void myFunc(int) {}
- person dyp   schedule 11.06.2015