SwiftUI: Ошибка автоматического обновления предварительного просмотра «Не удалось создать ContentView.swift»

#include <thread>
#include <iostream>

class bar {
public:
  void foo() {
    std::cout << "hello from member function" << std::endl;
  }
};

int main()
{
  std::thread t(&bar::foo, bar());
  t.join();
}

EDIT: Учет вашего редактирования, вы должны сделать это следующим образом:

  std::thread spawn() {
    return std::thread(&blub::test, this);
  }

UPDATE: я хочу объяснить несколько пунктов, некоторые из них также обсуждались в комментариях.

Синтаксис, описанный выше, определен в терминах определения INVOKE (§20.8.2.1):

Определить INVOKE (f, t1, t2,. .., tN) следующим образом:

  • (t1. * f) (t2, ..., tN), когда f является указателем на функцию-член класса T и t1 является объект типа T или ссылку на объект типа T или ссылку на объект типа, полученного из T;
  • ((* t1). * f) (t2, ..., tN ), когда f является указателем на функцию-член класса T и t1 не является одним из типов, описанных в предыдущем пункте;
  • t1. * f, когда N == 1 и f является указателем на данные члена класса T и t 1 являются объектами типа T или ссылкой на объект типа T или ссылкой на объект типа, полученного из T;
  • (* t1). * f, когда N == 1 и f является указателем на данные элемента класса T и t 1 не является один из типов, описанных в предыдущем пункте:
  • f (t1, t2, ..., tN) во всех других случаях.

Еще один общий факт, который я хочу отметить, заключается в том, что по умолчанию конструктор потока копирует все переданные ему аргументы. Причина этого в том, что аргументам может потребоваться пережить вызывающий поток, и копирование аргументов гарантирует это. Вместо этого, если вы хотите действительно передать ссылку, вы можете использовать std::reference_wrapper, созданный std::ref.

std::thread (foo, std::ref(arg1));

Поступая таким образом, вы обещаете, что будете заботиться о том, чтобы аргументы будут существовать, когда поток работает на них.


Обратите внимание, что все перечисленные выше могут также применяться к std::async и std::bind.

18
задан Ash_B 4 June 2019 в 17:36
поделиться