Вы вызываете неявные конструкторы, которые вы не определили (но были созданы для вас).Вы можете увидеть их в действии здесь:
#include <thread>
#include <iostream>
class ThreadClass {
public:
ThreadClass() {
std::cout << "Constructing..." << std::endl;
}
ThreadClass(const ThreadClass& t) {
std::cout << "Copy constructing..." << std::endl;
this->x = t.x;
}
// ThreadClass(ThreadClass&& t) {
// std::cout << "Move constructing..." << std::endl;
// this->x = t.x;
// }
~ThreadClass() {
std::cout << "Destructing..." << std::endl;
}
void operator()(int val) {
set(val);
std::cout << get() << std::endl;
set(val * 2);
std::cout << get() << std::endl;
}
void set(int val) {
x = val;
}
int get() {
return x;
}
private:
int x;
};
int main(int argc, char const *argv[]) {
std::thread x = std::thread(ThreadClass(), 10);
x.join();
return 0;
}
Вывод:
Построение ...
Копирование конструирование ...
Копированиеконструирование ...
Уничтожение ...
Уничтожение ...
10
20
Уничтожение ...
Вы можете раскомментировать конструктор перемещения, если хотите также увидеть это в действии.
Чтобы прямо ответить на ваши вопросы:
Почему это происходит?С уважением, я ожидал только один экземпляр ThreadClass.
Это происходит потому, что вы передаете объект, поэтому дополнительные конструкторы, упомянутые в посте, вызываются несколько раз.
Чтобы избежать неожиданного поведения, необходимо ли перегрузить некоторые операторы класса?
Что вы подразумеваете под неожиданным поведением?Это выполняет именно так, как намерен C ++.Это хорошо определенное поведение для C ++.