Почему есть дополнительный & для передачи адреса нестатической функции-члена потоку в C ++? - PullRequest
4 голосов
/ 12 июня 2019

Как я понимаю, само название функции служит указателем на нее.

Поэтому, когда у меня есть функция, я могу создать поток, просто передав его адрес конструктору потока, как показано ниже:

void thread_function {

}

std::thread threadObj1(thread_function);

Моя путаница возникает при передаче адреса нестатической функции-члена в поток. Например:

class ClassA
{
  public:
  void nonstatic_function()
  {

  }
};

ClassA instance;
std::thread threadObj2(ClassA::nonstatic_function, &instance);

Передача адреса такой функции осуществляется двумя способами:

ClassA::nonstatic_function

&ClassA::nonstatic_function

Почему существует дополнительный &? Если это действительно нужно, то почему же компилятор не жалуется даже без него?

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

Как я понимаю, само название функции служит указателем на нее.

Это поведение было унаследовано от C и применяется только к свободным функциям или статическим функциям-членам.

Для нестатических функций-членов не существует неявного преобразования в указатель на член. Указатель на член принципиально отличается от указателя свободной функции, потому что он не может быть вызван без предоставления экземпляра объекта.

Если это действительно нужно, то почему же компилятор не жалуется даже без него?

Полагаю, вы используете компилятор с нестандартным расширением, чтобы в этом случае пропустить &. Я полагаю, что более старые версии MSVC позволяли это исключить; и gcc / Windows по умолчанию разрешает это для совместимости с MSVC .

0 голосов
/ 12 июня 2019

std::bind помогает вам.

ClassA instance;
std::thread threadObj2(std::bind(&ClassA::nonstatic_function, &instance));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...