Может кто-нибудь объяснить следующие странные объявления функций? - PullRequest
2 голосов
/ 15 сентября 2010
std::thread f()
{
  void some_function(); // <- here
  return std::thread(some_function);
}

std::thread g()
{
  void some_other_function(int); // <- here
  std::thread t(some_other_function,42);
  return t;
}

Ответы [ 3 ]

4 голосов
/ 15 сентября 2010

Строки типа:

void some_function();

просто объявляют функцию, которая будет определена позже.Функции не обязательно должны быть объявлены вне области действия функции.

1 голос
/ 15 сентября 2010

Определить функцию, возвращающую объект thread:

std::thread f()
{

Объявите функцию extern без аргументов, возвращающую void (обычно это не делается в локальной области, но это допустимо):

void some_function();

Запустите поток, выполняющий эту функцию, и верните ей дескриптор:

return std::thread(some_function);
}

То же предложение, что и раньше:

std::thread g()
{
void some_other_function(int);

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

std::thread t(some_other_function,42);
return t;
}

Это будет работать, хотя:

return std::move( t );
1 голос
/ 15 сентября 2010

Это просто объявление функции, как вы и думали.Обычно (и рекомендуется) помещать объявления функций в заголовочные файлы, но это ни в коем случае не требуется.Они могут быть в функциональных органах.

...