По какой причине присоединяемый std :: thread не присоединяется автоматически?

Иногда было бы полезно, если бы присоединяемыйstd::thread был в состоянии выполнитьthread::join() на его деструкторе. Смотрите примеры ниже.

Пример 1 (ошибка): Объектstd::thread был уничтожен после броска исключения. Как только поток выходит из области видимости, деструктор называется ДО того, как произойдет соединение. Это заставляет STL показывать сообщение об ошибке 'abort'.

int main( int argc, const char * argv[] )
{
    try
    {
        thread t( [] ()
        {
            this_thread::sleep_for( chrono::seconds( 1 ) );
            cout << "thread done" << endl;
        } );

        throw exception( "some exception" );

        t.join();
    }
    catch ( const exception & )
    {
        cout << "exception caught!" << endl;
    }

    cout << "main done" << endl;

    return 0;
}

Пример 2 (правильный путь): Объектt создается перед моим блоком try-catch, а join () помещается в блоки try и catch. Так что это гарантирует, что join () произойдет.

int main( int argc, const char * argv[] )
{
    thread t;

    try
    {
        t = thread( [] ()
        {
            this_thread::sleep_for( chrono::seconds( 1 ) );
            cout << "thread done" << endl;
        } );

        throw exception( "some exception" );

        t.join( );
    }
    catch ( const exception & )
    {
        t.join();
        cout << "exception caught!" << endl;
    }

    cout << "main done" << endl;

    return 0;
}

... И ВОПРОС: В чем причина объединенияstd::thread не включится автоматически на его деструктор?

Было бы намного проще, если бы это произошло автоматически. То, как это делается сегодня, требует осторожности при использовании потоков внутри блоков try-catch, например ... но я уверен, что кто-то ДУМАЛ, когда разрабатываетсяstd::thread сюда. Так что должна быть причина для этого ... что это за причина?

PS: Я знаю, что мы можем вовлечьstd::thread в классе и положитьjoin() на деструкторе этого нового класса ... так что это становится автоматическим. Но это не главное. Мой вопрос действительно оstd::thread сам.

Ответы на вопрос(1)

Ваш ответ на вопрос