почему это std :: thread threadObj ((WorkerThread ())) вместо std :: thread threadObj (WorkerThread () ()) - PullRequest
0 голосов
/ 08 апреля 2020

Я запутался с тестом потока. Код:

#include <bits/stdc++.h>
class WorkerThread{
public:
    void operator()()
    {
        std::cout<<"Worker Thread "<<std::this_thread::get_id()<<" is Executing"<<std::endl;
    }
};
int main()
{
    std::thread threadObj((WorkerThread())); //confused line
    threadObj.join();
    std::cout<<"Exiting from Main Thread"<<std::endl;
    return 0;
}

Почему это std :: thread threadObj ((WorkerThread ())) вместо std :: thread threadObj (WorkerThread () ())? Большое спасибо!

Вывод:

Worker Thread 139661803513600 is Executing
Exiting from Main Thread

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

operator() - это просто имя со странным написанием.
Если вы переименуете его во что-то «не магическое», например «call_as_function», вы получите

class WorkerThread{
public:
    void call_as_function()
    {
        std::cout<<"Worker Thread "<<std::this_thread::get_id()<<" is Executing"<<std::endl;
    }
};

int main()
{
    std::thread threadObj(WorkerThread().call_as_function()); 
    threadObj.join();
    std::cout<<"Exiting from Main Thread"<<std::endl;
    return 0;
}

, где вы, вероятно, видите, что это неправильно - вы хотите передать экземпляр WorkerThread, а не результат вызова функции-члена экземпляра WorkerThread.

причина дополнительной пары скобок в рабочем Дело в том, что вам нужно

std::thread threadObj((WorkerThread()))

, а не

std::thread threadObj(WorkerThread())

, что без них вы получите объявление функции.

Возможно, вы видели что-то подобное,

request for member ‘join’ in ‘threadObj’, which is of non-class type ‘std::thread(WorkerThread (*)())’

, которое говорит, что threadObj - это функция, которая принимает указатель на функцию без параметров, которая возвращает WorkerThread, и возвращает std::thread.

Введите "самый неприятный синтаксический анализ" в поисковик по вашему выбору для деталей.

0 голосов
/ 08 апреля 2020

Прежде всего std::thread требуется вызываемый объект, а WorkerThread()() дает результат вызова WorkerThread::operator(), поэтому не будет никакого подходящего конструктора с WorkerThread()()

Если вы хотите спросить, почему нет используйте threadObj(WorkerThread()), потому что most vexing parse, компиляция рассматривает std::thread threadObj(WorkerThread()) как объявление функции, вы можете прочитать больше об этом здесь Most Vexing Parse

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...