C ++ 11:线程创建给我一个“尝试使用已删除的函数”错误

时间:2018-03-12 12:28:54

标签: c++ multithreading

我是线程处理的新手,我对这段代码无效的原因感到有些困惑:

// Note that the GKITH object is useful for my whole code
void thread_function( gkit2light_Handler*& GKITH )
{
    std::cout << "\t~ Writing from gkit2light thread..." << std::endl;
}

int main( int argc, char** argv )
{

    // Custom gkit2light Handler
    gkit2light_Handler *gkit_handler = new gkit2light_Handler( );

    // Launching thread...
    std::thread gkit_thread( thread_function, gkit_handler );

    return 0;

}

我使用XCode 9在macOS 10.13下运行它。 这些行中没有一个实际上抛出了我的错误,但我的编译器给了我这样的信息:«尝试使用已删除的函数»。 这很奇怪,因为这里thread_function()只访问stdout ......

这里是删除的功能,也许这可以帮到你!

struct __nat
{
#ifndef _LIBCPP_CXX03_LANG
    // ...

    // This is the destructor that is throwing the error
    ~__nat() = delete;
#endif
}; 

以下是错误的屏幕截图(没有更多信息): XCode compiler error screenshot

1 个答案:

答案 0 :(得分:1)

在将参数传递给thread时,您不能绑定这样的引用(这在at least one reference中说明)。要传递引用,请使用std::ref进行包装。这将在这些参数发生的移动/复制中存活下来。

令人遗憾的是,工具链会发出这样一个神秘的错误消息,但这意味着在其模板元编程中的某个地方尝试并且无法实例化与您编写的代码相关的一些模板。